【发布时间】:2013-10-11 06:25:55
【问题描述】:
我已经养成了访问 j 中 data.table 列的习惯,即使我不需要:
require(data.table)
set.seed(1); n = 10
DT <- data.table(x=rnorm(n),y=rnorm(n))
frm <- formula(x~y)
DT[,lm(x~y)] # 1 works
DT[,lm(frm)] # 2 fails
lm(frm,data=DT) # 3 what I'll do instead
我希望 #2 能够工作,因为 lm 应该在 DT 中搜索变量,然后在全局环境中搜索...有没有一种优雅的方法可以让 #2 工作?
在这种情况下,我使用的是lm,它接受一个“数据”参数,所以#3 可以正常工作。
编辑。请注意,这是可行的:
x1 <- DT$x
y1 <- DT$y
frm1 <- formula(x1~y1)
lm(frm1)
还有这个:
rm(x1,y1)
bah <- function(){
x1 <- DT$x
y1 <- DT$y
frm1 <- formula(x1~y1)
lm(frm1)
}
bah()
EDIT2.但是,这失败了,说明@eddi的答案
frm1 <- formula(x1~y1)
bah1 <- function(){
x1 <- DT$x
y1 <- DT$y
lm(frm1)
}
bah1()
【问题讨论】:
-
试试
DT[, lm(frm, .SD)](see here)。 -
不确定这是否适合您的实际用例,但以下方法确实有效
m <- quote(lm(x~y)); DT[,eval(m)]。 -
它失败了,因为 x 和 y 没有在您的
j中使用,并且因为通常data.table只构造它可以检测到正在使用的那些列(并且因为它之前只能是那么聪明变得无所不能;))-我还没有尝试过,但是我认为即使您这样做{x; y; lm(frm)}也可以。也许这里有一个 FR 使用.SDcols来指示使用的列,即使没有.SD -
j寻找他们是一个非常抽象的陈述,需要对您的j所做的事情有一个人工智能级别的理解。我有点惊讶地明确使用x和y没有这样做,我一定是误解了根本问题。 Re FR:请添加。 -
啊,我现在明白了,这是一个
lm特有的问题——它在公式的环境中寻找这些变量,所以将变量添加到j环境中(通过使用他们不知何故)没有帮助,因为公式环境在这里是.GlobalEnv。
标签: r scope data.table