【问题标题】:Patch function which calls .Call调用 .Call 的补丁函数
【发布时间】:2020-03-20 04:28:45
【问题描述】:

我的目标是修补rlang::eval_tidy 函数。在其original form 中,它只调用.Call

eval_tidy <- function(expr, data = NULL, env = caller_env()) {
  .Call(rlang_eval_tidy, expr, data, env)
}

在我的情况下,对于一种单一类型的值,它的行为应该不同。因此,我将其更改为可以添加自定义行为的多方法:

package <- getNamespace('rlang')
unlockBinding('eval_tidy', package)
package$eval_tidy <- function(expr, data=NULL, env=caller_env()) UseMethod('eval_tidy', data)
lockBinding('eval_tidy', package)
eval_tidy.custom.value <- function(expr, data, env) ....
eval_tidy.default <- function(expr, data, env) .Call(rlang_eval_tidy, expr, data, env)

现在它像我的自定义数据类型一样工作,但如果使用其他数据类型,我会收到以下错误:

NotImplementedError:eval_tidy.default(X[[i]]) 中的错误:对象 'rlang_eval_tidy' 未找到

【问题讨论】:

    标签: r tidyverse rlang tidyeval


    【解决方案1】:

    这是因为rlang_eval_tidynot exported(因此不可见)在rlang 之外的编译对象。您实际上并不需要覆盖包定义。只需将您的自定义实现定义为顶层:

    eval_tidy <- function(expr, ...) UseMethod('eval_tidy')
    eval_tidy.custom <- function(expr, ...) cat("Running custom eval\n")
    eval_tidy.default <- function(expr, ...) rlang::eval_tidy(expr, ...)
    
    e1 <- quote(1+1)
    eval_tidy(e1)
    # [1] 2
    
    class(e1) <- "custom"
    eval_tidy(e1)
    # Running custom eval
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 2012-02-17
      • 2023-01-03
      • 2012-12-12
      • 1970-01-01
      • 2019-03-11
      相关资源
      最近更新 更多