【问题标题】:Evaluate expression with in-function variable calculation使用函数内变量计算评估表达式
【发布时间】:2019-03-07 02:14:28
【问题描述】:

基本上,我想创建一个绑定到原始数​​据集的add_trend 函数。但是,我想使用表达式来做到这一点。例如.t = 线性趋势,.t + .t^2 = 二次趋势。

.data <- tibble::tibble(
  x = rnorm(100),
  y = rnorm(100))


add_trend <- function(.data, .f = NULL) {

  .t <- 1:NROW(.data)

  .expr <- quote(.f)
  eval(.expr)
}

add_trend(.data, .t^2)
#> Error in eval(.expr): object '.t' not found

reprex package (v0.2.1) 于 2019-03-07 创建

它必须与评估的环境有关。如果我将.t 存储在Global_Env 中,则该函数可以工作,但是当它在函数内部完成时,就会出现上述错误。任何帮助将不胜感激。

【问题讨论】:

  • 该错误告诉您它找不到正向管道运算符 (%>%)。您必须先加载 dplyr / tidyverse 包。
  • 在所有函数前加上句点也很奇怪。这通常意味着它们是“隐藏”变量。这真的是你想要的吗?您是否尝试使用rlang 评估?因为quote()eval() 是基本R 函数,而不是rlang 版本。
  • @SantiagoCapobianco 这是一个糟糕的代表,问题不在管道中。
  • @MrFlick 我不知道如果我知道关于点后缀的理论,我只是为了解决冲突。你有什么建议? enexpr - eval_bare 或者还有其他方法吗?

标签: r eval environment rlang


【解决方案1】:

使用substitute 而不是quote

add_trend <- function(.data, .f = NULL) {
  .t <- 1:NROW(.data)
  .expr <- substitute(.f)
  eval(.expr)
}

来自help("quote")

substitute 返回(未计算的)表达式的解析树 expr,替换绑定在 env 中的任何变量。

quote 只是返回它的参数。参数不被评估并且 可以是任何 R 表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2023-01-10
    相关资源
    最近更新 更多