4

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

lmグローバル環境で変数を検索する必要があるため、#2が機能すると予想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()
4

1 に答える 1

4

lm提供された数式の環境で使用される変数を検索する方法が機能します。グローバル環境で式を作成するため、j-expression 環境では検索されないため、正確な式をlm(frm)機能させる唯一の方法は、適切な変数を正しい環境に追加することです。

DT[, {assign('x', x, environment(frm));
      assign('y', y, environment(frm));
      lm(frm)}]

明らかに、これはあまり良い解決策ではなく、Arun と Josh の両方の提案ははるかに優れており、目前の問題を理解するためにここに置いています。

editもう 1 つの (おそらくもっとひねくれていて、非常に壊れやすい) 方法は、式の環境を変更することです (ここでは永続的に行いますが、元に戻すか、コピーしてから行うこともできます)。

DT[, {setattr(frm, '.Environment', get('SDenv', parent.frame(2))); lm(frm)}]

ところで、ここで面白いことが起こっています - getin j-expression を使用するたびに、すべての変数が構築されます (回避できる場合は使用しないください)。これらの変数が必要であることを知る方法。xydata.table

于 2013-10-11T15:17:00.437 に答える