You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否不修改内部函数行为,在包装调用时获取原始符号名?

非标准求值下的符号传递问题

我猜测答案是不行,必须使用标准求值逃逸机制,不过或许有人有其他思路。

先看一个利用非标准求值获取传入对象符号/名称的函数:

inner_func <- function(inner_arg) {
    substitute(inner_arg)
}

inner_func(iris)
#> iris

但如果在包装函数里调用inner_func(),这个逻辑就失效了:

wrapper_func <- function(wrapper_arg) {
    inner_func(wrapper_arg)
}

wrapper_func(iris)
#> wrapper_arg

核心问题:是否存在方法,在不修改inner_func()行为的前提下,即使在其他函数内调用它,也能获取到原始符号?

我知道一种可行方案,但它需要修改inner_func():

inner_func <- function(inner_arg) {
    evalq(as.symbol(inner_arg))
}

wrapper_func <- function(wrapper_arg) {
    # 将符号转为字符
    obj_name <- deparse(substitute(wrapper_arg))
    
    # 在inner_func()内将字符转回符号
    inner_func(obj_name)
}

wrapper_func(iris)
#> iris

但这个方案的问题在于,修改后的inner_func()无法像最初那样直接调用:

inner_func(iris)

#> Error in as.vector(x, mode = mode) :
 'list' object cannot be coerced to type 'symbol'

我希望所有额外处理都在wrapper_func()中完成,不改动inner_func()。


内容的提问来源于stack exchange,提问作者DuckPyjamas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:44:59