2

:=同じデータ テーブルを使用して、長い一連の連鎖計算を行っていることがよくあります。たとえば、このようなもの

test = data.table(1:10, 1:10, 1:10, 1:10)

test[, V1 := V1^2]
test[, V2 := V1*V2]
test[, V3 := V2/V3]
test[, V4 := sqrt(V3)]
test[, new := letters[V4]]

すべての行に書き込むtest[, ...]必要があるため、1) 入力に時間がかかります (私が対処できる大きな問題ではありません)。しかし、もっと重要なことは、計算の流れと内容から視覚的に注意をそらすことでもあります。私はむしろ次のようなものを書きたいです

test[, {
  V1 := V1^2
  V2 := V1*V2
  V3 := V2/V3
  V4 := sqrt(V3)
  new := letters[V4]
}]

しかし、これはのエラーをスローしますYou have wrapped := with {} which is ok but then := must be the only thing inside {}

書けることを知っている

within(test, {
  V1 = V1^2
  V2 = V1*V2
  V3 = V2/V3
  V4 = sqrt(V3)
  new = letters[V4]
  })

しかし、これは使用効率を失います:=

この機能を提供する関数を書いてみました

with.dt = function(dt, expressions){
  e = strsplit(expressions,'\n')
  for (i in 1:length(e)){    
    dt[, eval(parse(text = e[i]))]
  }
  dt
  }

with.dt(test, "
  V1 := V1^2;
  V2 := V1*V2;
  V3 := V2/V3;
  V4 := sqrt(V3);
  new := letters[V4];
  ")

しかし、これはdata.tableの内容を変更しません

withinの参照による割り当てプロパティを保持しながら、バージョンのすっきりとした外観を可能にする構文はあります:=か?

4

2 に答える 2

2

これを行うには、いくつかの方法があります。

ここで使用される元のテスト マトリックス:

   v1 v2
1:  1  3
2:  2  4

まず、次のようなことができます。

test[,`:=`(v1 = v1^2,
          v2 = v1*v2)

出力:

v1 v2
 1  3
 4  8

または、順番に実行したい場合は、フランクのハックを使用できます。

test[, `:=`(v1 = v1 <- v1^2, v2 = v2 * v1)]

出力:

v1 v2
 1  3
 4 16  

または、同様にこれを実行することもできます:

test[,c("v1","v2") := list(v1^2,v1^2*v2)]

出力:

v1 v2
 1  3
 4 16
于 2016-12-07T17:56:48.397 に答える