如何在函数内将 R data.table 列名与 cube(..., j = ,...) 一起使用?

Max*_*van 5 r data.table

我可以获得由其他变量分层的变量的摘要,如下所示:

require(data.table)

DT <- data.table(mtcars)

var_work <- "hp"
by_vars <- c("cyl", "carb")

ans_1 <- cube(DT, j = as.list(quantile(get(var_work))), by = by_vars)

ans_1
    cyl carb  0%    25%   50%    75% 100%
 1:   6    4 110 110.00 116.5 123.00  123
 2:   4    1  65  66.00  66.0  93.00   97
 3:   6    1 105 106.25 107.5 108.75  110
 4:   8    2 150 150.00 162.5 175.00  175
 5:   8    4 205 218.75 237.5 245.00  264
 6:   4    2  52  69.25  93.0 105.50  113
 7:   8    3 180 180.00 180.0 180.00  180
 8:   6    6 175 175.00 175.0 175.00  175
 9:   8    8 335 335.00 335.0 335.00  335
10:   6   NA 105 110.00 110.0 123.00  175
11:   4   NA  52  65.50  91.0  96.00  113
12:   8   NA 150 176.25 192.5 241.25  335
13:  NA    4 110 123.00 210.0 241.25  264
14:  NA    1  65  66.00  93.0 101.00  110
15:  NA    2  52  92.00 111.0 150.00  175
16:  NA    3 180 180.00 180.0 180.00  180
17:  NA    6 175 175.00 175.0 175.00  175
18:  NA    8 335 335.00 335.0 335.00  335
19:  NA   NA  52  96.50 123.0 180.00  335
Run Code Online (Sandbox Code Playgroud)

接下来,我想编写一个辅助函数来实现上面显示的内容,但是会产生错误:

my_fun <- function(table_work, var_w, by_v) {

    tab_out <- cube(table_work, j = as.list(quantile(get(var_w))), by = by_v)
    return(tab_out)

}

ans_2 <- my_fun(table_work = DT, var_w = var_work, by_v = by_vars)

Error in get(var_w) : object 'var_w' not found

Run Code Online (Sandbox Code Playgroud)

我在一些相关的博客(例如,使用 data.table 的高级提示和技巧)和帖子(例如,由Henrikfrankc撰写)中搜索了答案,并尝试了 quote()、eval()、get() 的不同组合、assign() 等在“my_fun”中,但对我没有任何作用。

问题是:我应该如何纠正“my_fun”辅助函数,使其工作并产生与 ans_1 相同的结果?

R version 3.6.1 (2019-07-05)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Mojave 10.14.5

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libRlapack.dylib

locale:
[1] en_AU.UTF-8/en_AU.UTF-8/en_AU.UTF-8/C/en_AU.UTF-8/en_AU.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] Matrix_1.2-18     fst_0.9.0         data.table_1.12.8

loaded via a namespace (and not attached):
[1] compiler_3.6.1  parallel_3.6.1  Rcpp_1.0.3      grid_3.6.1      lattice_0.20-38

Run Code Online (Sandbox Code Playgroud)

chi*_*n12 4

data.table:::cube.data.table当阅读和 的代码时data.table:::groupingsets.data.tablej已经使用 NSE 计算了该参数。因此,由于无法传递到as.name(var_work)的环境参数substitute,该函数将会失败。

作为解决方法,您可以使用.SDcols

library(data.table)    
DT <- data.table(mtcars)    
var_work <- "hp"
by_vars <- c("cyl", "carb")

my_fun <- function(table_work, var_w, by_v) {
    cube(table_work, j=as.list(quantile(.SD[[1L]])), by=by_v, .SDcols=var_w)
}

ans_2 <- my_fun(table_work = DT, var_w = var_work, by_v = by_vars)
Run Code Online (Sandbox Code Playgroud)