首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用.Call的补丁函数

调用.Call的补丁函数
EN

Stack Overflow用户
提问于 2019-11-24 21:02:40
回答 1查看 68关注 0票数 0

我的目标是修补rlang::eval_tidy函数。在它的原始形式中,它只调用.Call

代码语言:javascript
复制
eval_tidy <- function(expr, data = NULL, env = caller_env()) {
  .Call(rlang_eval_tidy, expr, data, env)
}

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

代码语言:javascript
复制
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‘

EN

回答 1

Stack Overflow用户

发布于 2019-11-25 15:58:13

这是因为rlang_eval_tidy是一个编译过的对象,在rlang之外是未出口 (因此不可见)。您实际上不需要覆盖包定义。只需将您的自定义实现定义为顶层的一个层:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59022376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档