R 将函数中的变量传递给lm()的data.table

R 将函数中的变量传递给lm()的data.table,r,function,data.table,lm,R,Function,Data.table,Lm,我想创建一个函数,在所有data.table列上运行lm(),但指定依赖(x)和by列。data.table、x和by参数被传递给函数 我正在使用David Arenburg的data.table[solution][1]和lappy()计算lm(),并尝试使用deparse()和substitute()通过函数传递变量,但没有成功 下面是所需data.table结果和my函数尝试的MWE,尝试将参数作为变量而不是带引号的字符串传递 我相信这涉及到非标准评估(我在Advanced R中读过NSE

我想创建一个函数,在所有data.table列上运行lm(),但指定依赖(x)和by列。data.table、x和by参数被传递给函数

我正在使用David Arenburg的data.table[solution][1]和lappy()计算lm(),并尝试使用deparse()和substitute()通过函数传递变量,但没有成功

下面是所需data.table结果和my函数尝试的MWE,尝试将参数作为变量而不是带引号的字符串传递

我相信这涉及到非标准评估(我在Advanced R中读过NSE,但我的理解不太清楚)

感谢您的帮助,谢谢

库(data.table)
种子集(123)
#样本数据集

数据1使用
quote
substitute
lm
公式和
.SDcols

fun1 <- function(dt, y, by_col) {
    expr <- quote(dt[, 
        .(lm_results=lapply(.SD, function(x) summary(lm(Y ~ x)))),
        .SDcols=sdcols,
        by=byexpr])
    eval(do.call(substitute, list(expr, 
        list(sdcols=substitute(!y), Y=as.name(y), byexpr=substitute(by_col)))))
}

fun1(data1, "colA", colD)

我认为
比平常更神秘
by
可以接受一个字符串,所以也许可以尝试
by=deparse(substitute(by_col))
Hmm,运气不好。有一条很好的错误消息建议使用
by=eval(deparse(substitute())
,但这对我也不起作用。好吧,坏消息是,如果您更改为
by=by\u col
,并使用一个引用的列名,这应该会起作用,那么在另一段中会有一个错误:
c中的错误(deparse(substitute(y)),):参数2为空
。是的,我尝试了几种不同的方法,包括将公式参数作为字符串传递给
lm
,以及传递的变量的不同NSE变体。在函数中,如果您通过
删除
,并将
lm(替换(y)~x)
更改为
lm(colA~x)
它会工作,因此我想这是一个起点。谢谢!为什么使用
quote
而不是
substitute
来创建
expr
?我对
eval
部分也不太清楚。我读到,
quote
eval
是对立的,它们相互剥离。因此
eval
计算
do.call
,调用
substitute
作为函数,您已经传递了一个包含
expr
的列表,然后是第二个包含
expr
内变量的列表。它如何知道将
列表(sdcols=substitute(!y)…
传递到
列表(expr…)
,以及如何将这些作为多个参数传递到
substitute
?对于这些基本问题,我很抱歉……谢谢!
      colD   lm_results
1:  apples <summary.lm>
2:  apples <summary.lm>
3: bananas <summary.lm>
4: bananas <summary.lm>