R 将函数中的变量传递给lm()的data.table
我想创建一个函数,在所有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,但我的理解不太清楚) 感谢您的帮助,谢谢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)
种子集(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>