我有一个函数,它在一个列表中返回两个值.这两个值都需要添加到数据中.表中有两个新列.函数的计算代价很高,所以我希望避免计算函数两次.下面是一个例子:

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个,我只需要一种方法,通过引用一次添加两列.

推荐答案

data.table v1开始.8.3,你可以这样做:

DT[, c("new1","new2") := myfun(y,v)]

另一个选项是存储函数的输出并逐个添加列:

z <- myfun(DT$y,DT$v)
head(DT[,new1:=z$r1][,new2:=z$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

R相关问答推荐

收件箱摘要表布局在第一列上显示子类别

想要创建一个可以存储四个多元正态总体的多元偏度的载体

R包terra在投影时如何决定模板格栅属性?

使用格式化程序自定义hc_tooltip以添加textColor删除了我的标记并try 将它们带回失败

更新合适的R mgcv::bam模型报告无效类型(关闭).'';错误

在R中列表的结尾添加数字载体

使用tidyverse / Mutate的存款账户余额

咕噜中的元素列表:map

为什么在ggplot2中添加geom_text这么慢?

然后根据不同的列值有条件地执行函数

如何将移除事件分配给动态创建的按钮?

用值序列对行进行子集化,并标识序列开始的列

如何在modelsummary中重命名统计数据?

在另存为PNG之前隐藏htmlwidget绘图元素

在R中,如何将变量(A,B和C)拟合在同一列中,如A和B,以及A和C在同一面板中?

为什么我的基准测试会随着样本量的增加而出现一些波动?

在RStudio中堆叠条形图和折线图

汇总数据的Sheffe检验的P值(平均值和标准差)

如何对r中包含特定(未知)文本的行求和?

计算来自单独分组的分幅的值的百分位数