尝试以编程方式在data.table中创建列时出错

时间:2015-11-02 18:15:00

标签: r data.table

当我尝试以编程方式data.table创建新列时出现此错误:

dt[, (new_x) := get(x)]
# Error in get(x) : invalid first argument

其中x是一个变量,它保存我在赋值中使用的列的名称,在这种情况下恰好也命名为"x"。换句话说,x <- "x""x" %in% names(dt)TRUE。仅当变量名称与列名称相同时才会出现此错误。

可重现的例子:

library(data.table)

# Our data.table
dt <- as.data.table(mtcars)
dt
#     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# 1: 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
# 2: 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
# 3: 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
# 4: 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
# ...

# My new column name
new_col <- "new_column"
# Will make my new column be the sum of two columns
mpg <- "mpg"
cyl <- "cyl"

# I thought this would work:
dt[, (new_col) := get(mpg) + get(cyl)]
# Error in get(mpg) : invalid first argument

# If the variable names are not the same as the string it contains, it works
mpg_col <- "mpg"
cyl_col <- "cyl"
dt[, (new_col) := get(mpg_col) + get(cyl_col)]

现在,在我的脚本中,我有一个辅助函数,它接受两个列名xy,作为计算名称为new_col的新列的参数。

calculate_new_column <- function(dt, x, y, new_col) { 
  dt[, (new_col) := some calculation with x and y ]
}

有没有办法让我的功能对x = 'x'y = 'y'这种极端情况安全?我想我可以给函数的参数赋予唯一的名称(例如.x..y.),但更喜欢更好的解决方案。

修改

按照我可重复的例子,它似乎有效:

dt[, (new_col) := get(eval(mpg)) + get(eval(cyl))]

但我对使用eval持谨慎态度,并且不确定这是否遵循最佳做法。这会是要走的路吗?

0 个答案:

没有答案