【问题标题】:How to paste parameters in R functions using `substitute` and `eval` to make data.table work like dplyr?如何使用`substitute`和`eval`在R函数中粘贴参数以使data.table像dplyr一样工作?
【发布时间】:2021-11-04 22:30:09
【问题描述】:

我有一个工作 R 函数写成:

library(data.table)
mutate_dt = function (.data, ..., by) 
{
    dt = as.data.table(.data)
    substitute(dt[, `:=`(...), by][]) %>% eval()
}

但是,我无法在其他功能中使用此功能。例如:

t_f = function(dt,x){
  mutate_dt(dt,a = x)
}

t_f(iris,1)
#> Error in eval(jsub, SDenv, parent.frame()): object 'x' not found

有什么方法可以让它工作吗?

【问题讨论】:

  • eval.parent(substitute(dt[, `:=`(...), by][]), 1)
  • @Roland 请回复

标签: r dplyr data.table non-standard-evaluation


【解决方案1】:

您需要确保在正确的环境中计算表达式。 R 通过提供方便的函数eval.parent 使其变得容易:

library(data.table)
mutate_dt = function (.data, ..., by) 
{
  dt = as.data.table(.data)
  eval.parent(substitute(dt[, `:=`(...), by][]))
}

mutate_dt(iris,a = 1)
#works

t_f = function(dt,x){
  mutate_dt(dt,a = x)
}

t_f(iris,2)
#works

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-26
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2021-08-08
    • 2020-11-15
    • 2020-02-18
    相关资源
    最近更新 更多