【发布时间】:2012-07-03 18:10:53
【问题描述】:
我有一个在列表中返回两个值的函数。两个值都需要添加到 data.table 的两个新列中。函数的评估成本很高,所以我想避免两次计算函数。示例如下:
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
这是我的函数的一个示例。请记住,我说过它的计算成本很高,除此之外,没有办法从其他给定值中推断出一个返回值(如下例所示):
myfun <- function (y, v)
{
ret1 = y + v
ret2 = y - v
return(list(r1 = ret1, r2 = ret2))
}
这是我在一个语句中添加两列的方法。但是,那需要调用 myfun 两次:
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
关于如何做到这一点的任何建议?每次调用 myfun 时,我都可以将 r2 保存在单独的环境中,我只需要一种方法来一次通过引用添加两列。
【问题讨论】:
-
为什么不让你的函数接收一个数据框并直接返回一个数据框呢? `myfun
-
@Etienne 因为这会复制输入以创建新输出。 Florian 使用
data.table来提高其对大型数据集的内存效率;它根本不会复制x、y或v,甚至一次。想想 RAM 中的 20GB 数据集。
标签: r data.table