当我尝试以编程方式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)]
现在,在我的脚本中,我有一个辅助函数,它接受两个列名x
和y
,作为计算名称为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
持谨慎态度,并且不确定这是否遵循最佳做法。这会是要走的路吗?