Atribuindo elegantemente múltiplas colunas em data.table com lapply ()

Eu estou tentando descobrir uma maneira elegante de usar:= atribuição para substituir muitas colunas de uma só vezdata.table aplicando uma função compartilhada. Um uso típico disso pode ser aplicar uma função de string (por exemplo,gsub) para todas as colunas de caracteres em uma tabela. Não é difícil estender odata.frame maneira de fazer isso para umdata.table, mas estou procurando um método consistente com odata.table maneira de fazer as coisas.

Por exemplo:

library(data.table)

m <- matrix(runif(10000), nrow = 100)
df <- df1 <- df2 <- df3 <- as.data.frame(m)
dt <- as.data.table(df)
head(names(df))
head(names(dt))

## replace V20-V100 with sqrt

# data.frame approach
# by column numbers
df1[20:100] <- lapply(df1[20:100], sqrt)
# by reference to column numbers
v <- 20:100
df2[v] <- lapply(df2[v], sqrt)
# by reference to column names
n <- paste0("V", 20:100)
df3[n] <- lapply(df3[n], sqrt)

# data.table approach
# by reference to column names
n <- paste0("V", 20:100)
dt[, n] <- lapply(dt[, n, with = FALSE], sqrt)

Eu entendo que é mais eficiente fazer um loop sobre um vetor de nomes de coluna usando:= atribuir:

for (col in paste0("V", 20:100)) dt[, col := sqrt(dt[[col]]), with = FALSE]

Eu não gosto disso porque eu não gosto de referênciadata.table em umj expressão. Eu também sei que eu posso usar:= para atribuir comlapply dado que eu sei os nomes das colunas:

dt[, c("V20", "V30", "V40", "V50", "V60") := lapply(list(V20, V30, V40, V50, V60), sqrt)]

(Você pode estender isso criando uma expressão com nomes de colunas desconhecidos.)

Abaixo estão as ideias que experimentei, mas não consegui fazê-las funcionar. Eu estou cometendo um erro, ou há outra abordagem que estou perdendo?

# possible data.table approaches?
# by reference to column names; assignment works, but not lapply
n <- paste0("V", 20:100)
dt[, n := lapply(n, sqrt), with = FALSE]
# by (smaller for example) list; lapply works, but not assignment
dt[, list(list(V20, V30, V40, V50, V60)) := lapply(list(V20, V30, V40, V50, V60), sqrt)]
# by reference to list; neither assignment nor lapply work
l <- parse(text = paste("list(", paste(paste0("V", 20:100), collapse = ", "), ")"))
dt[, eval(l) := lapply(eval(l), sqrt)]

questionAnswers(3)

yourAnswerToTheQuestion