使用 magrittr 反向管道编写非标准评估语法

Writing non-standard evaluation syntax with use of magrittr reverse pipe

我正在寻找简化代码的简单方法。

例子

sqrt 函数可以轻松应用于下面的列子集。

require(magrittr)
mtcars[,-which(colnames(mtcars) %in% 
                 c("mpg", "cyl", "drat", "wt", "carb",
                   "hp", "qsec", "vs", "am", "gear"))] %<>%
  sqrt

问题

我有兴趣将其他转换应用于子集 ,而无需 再次键入整个子集序列。

例如代码:

mtcars[,-which(colnames(mtcars) %in% 
                 c("mpg", "cyl", "drat", "wt", "carb",
                   "hp", "qsec", "vs", "am", "gear"))] %<>%
  .data * 1000

会return错误:

Error in function_list[[k]](value) : could not find function ".data"

与使用 . 的语法相同。我的问题是:在语法方面,如何获得与 sqrt 函数相同的效果,但将更长的函数应用于传递的子集?

怎么样?

sel_cols <- setdiff(colnames(mtcars), 
                    c("mpg", "cyl", "drat", "wt", "carb",
                      "hp", "qsec", "vs", "am", "gear"))
mtcars[, sel_cols] %<>% {sqrt(.) %>% `*`(1000)}

还是data.table方法?

library(data.table)
sel_cols <- setdiff(colnames(mtcars), 
                    c("mpg", "cyl", "drat", "wt", "carb",
                      "hp", "qsec", "vs", "am", "gear"))

dt <- as.data.table(mtcars)
dt[, (sel_cols) := lapply(.SD, sqrt), .SDcols = sel_cols][]

并结合管道:

dt <- as.data.table(mtcars)
dt[, (sel_cols) := lapply(.SD, function(x) {sqrt(x) %>% `*`(1000)}), .SDcols = sel_cols][]