リストに2つの値を返す関数があります。両方の値を2つの新しい列のdata.tableに追加する必要があります。関数の評価にはコストがかかるので、関数を2回計算する必要はありません。次に例を示します。
library(data.table)
example(data.table)
DT
x y v
1: a 1 42
2: a 3 42
3: a 6 42
4: b 1 4
5: b 3 5
6: b 6 6
7: c 1 7
8: c 3 8
9: c 6 9
これが私の関数の例です。コストのかかる計算だと言ったことを思い出してください。それに加えて、(以下の例のように)他の指定された値から1つの戻り値を推測する方法はありません。
myfun <- function (y, v)
{
ret1 = y + v
ret2 = y - v
return(list(r1 = ret1, r2 = ret2))
}
これが、1つのステートメントに2つの列を追加する私の方法です。ただし、myfunを2回呼び出す必要があります。
DT[,new1:=myfun(y,v)$r1][,new2:=myfun(y,v)$r2]
x y v new1 new2
1: a 1 42 43 -41
2: a 3 42 45 -39
3: a 6 42 48 -36
4: b 1 4 5 -3
5: b 3 5 8 -2
6: b 6 6 12 0
7: c 1 7 8 -6
8: c 3 8 11 -5
9: c 6 9 15 -3
これを行う方法について何か提案はありますか?r2
myfunを呼び出すたびに別の環境に保存できますが、参照によって一度に2つの列を追加する方法が必要です。