在R`data.table`中使用命名列表和`设置多列:=`

在R`data.table`中使用命名列表和`设置多列:=`,r,data.table,R,Data.table,使用:=创建新列是我最喜欢的data.table功能之一。我知道有两种方法可以使用它一次添加多个列。这里有一个简单的例子 dt <- data.table("widths" = seq(2, 10, 2), "heights" = 8:4) dt widths heights 1: 2 8 2: 4 7 3: 6 6 4: 8 5 5: 10

使用
:=
创建新列是我最喜欢的data.table功能之一。我知道有两种方法可以使用它一次添加多个列。这里有一个简单的例子

dt <- data.table("widths" = seq(2, 10, 2), "heights" = 8:4)
dt
   widths heights
1:      2       8
2:      4       7
3:      6       6
4:      8       5
5:     10       4
这两种方法都需要提前输入新列的名称。您可以手动输入它们,也可以在创建列之前将它们保存在对象中,或者在
:=
的左侧有一个生成名称的函数。我不知道的是如何在一次调用中获得名称和输出到
:=

有办法做到这一点吗?下面是我希望做的一个例子:

dt[ , (new_cols) := NULL] # delete the previously added area and perimeter cols.
dt[ , `:=`(my_fun(widths, heights))]
dt
   widths heights areas perimeters
1:      2       8   16        20
2:      4       7   28        22
3:      6       6   36        24
4:      8       5   40        26
5:     10       4   40        28
理想情况下,有一种方法可以使
:=
看到
my_fun()
返回名称,然后将这些名称用作新列的名称。我知道上面会产生一个错误,但我想知道是否有一种简单的方法来获得所需的功能,因为这在有许多列或列名依赖于函数输入的较大问题中会很有用

编辑:
我正在寻找的关键问题是通过引用来分配这些列的方法,即使用
:=
或set(),并且我还希望将输出的类作为
数据进行维护

data.frame(dt, my_fun(dt$widths, dt$heights))

#  widths heights areas perimeters
#1      2       8    16         20
#2      4       7    28         22
#3      6       6    36         24
#4      8       5    40         26
#5     10       4    40         28

不幸的是,
data.table(dt,my_-fun(dt$widths,dt$heights))
不起作用。

注释太长。不漂亮:

dt[, {
    a <- my_fun(widths, heights)   
    for (x in names(a))
        set(dt, j=x, value=a[[x]])
}]
dt[,{

a
dt[,c(mget(name(.SD)),my_-fun(widts,heights))]
,或者可能是
cbind(dt,dt[,my_-fun(widts,heights)]
,但它们都没有在原地做任何事情谢谢。mget()选项很好,但我要寻找的关键是使用
:=
或set()进行原地更新我想,
dt[,do.call(“:=”,我的乐趣(宽度,高度))]
理论上完全可以满足您的需求,但目前还不起作用。我已经提交了一个问题,感谢您提交该问题。内置的东西会非常好,因为在这种情况下可以使用
和所有其他data.table工具。谢谢,但这不是我想要的。我想保留data.table类并在不复制
dt
的情况下添加新列。感谢此解决方案。我接受它,因为它符合我的要求。如果您对如何在使用
by=
分组时轻松扩展此功能有任何想法,那就太好了。也许可以添加by参数和I with.I
data.frame(dt, my_fun(dt$widths, dt$heights))

#  widths heights areas perimeters
#1      2       8    16         20
#2      4       7    28         22
#3      6       6    36         24
#4      8       5    40         26
#5     10       4    40         28
dt[, {
    a <- my_fun(widths, heights)   
    for (x in names(a))
        set(dt, j=x, value=a[[x]])
}]