r - 在 R 的另一个函数中使用 data.table

标签 r data.table

当创建包含列的新变量时,data.table 不允许带引号的列名。 当在函数中使用 data.table 时,这会产生以下问题。

library(data.table) 
dt <- data.table(var1 = c(1:10), var2 = seq(2,20,2), var3 = seq(40,4,-4))    

addColumnsError <- function(dt, v1, v2){
  dt[,v1 + v2]
}

addColumnsError(dt, var1, var2)
>  Error in eval(jsub, SDenv, parent.frame()) : object 'var1' not found 

addColumnsError(dt, "var1", "var2")
>   Error in v1 + v2 : non-numeric argument to binary operator

以下解决方法可以解决此问题。

addColumns <- function(dt,v1,v2){

  v1<-as.character(substitute(v1))
  v2<-as.character(substitute(v2))

  dt[,eval(parse(text=v1)) + eval(parse(text=v2))]
}

addColumns(dt, var1, var2)
[1]  3  6  9 12 15 18 21 24 27 30
addColumns(dt, "var1", "var2")
[1]  3  6  9 12 15 18 21 24 27 30

是否有更优雅的方法将列名传递给函数内的 data.table 对象?

(注意:我可以只调用 data.table 函数,但我打算进行更复杂的计算:) )

最佳答案

如果你想使用非标准评估,你需要像substitute这样的东西。但是,绝对没有理由使用 parse

addColumnsError <- function(dt, v1, v2){
  eval(substitute(dt[, v1 + v2]))
}

addColumnsError(dt, var1, var2)
#[1]  3  6  9 12 15 18 21 24 27 30

关于r - 在 R 的另一个函数中使用 data.table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54442053/

相关文章:

R 中的 read.table 和评论

r - 使用字符串中的列名初始化 R data.table

r - 基于列名模式的多个成对差异

R 不更新 data.table

协调一列中的重复项与另一列中的各种值

R - 如何在 Shiny 中使用 selectInput 来更改 ggplot 渲染图中的 x 和填充变量?

r - 测试字符是否在字符串中

r - 无法将 ggsn 比例尺添加到 ggplot

r - 如何选择一个表中与另一个表中的行相匹配的所有行

r - 使用 data.table 计算 adstock