能否不修改内部函数行为,在包装调用时获取原始符号名?
非标准求值下的符号传递问题
我猜测答案是不行,必须使用标准求值逃逸机制,不过或许有人有其他思路。
先看一个利用非标准求值获取传入对象符号/名称的函数:
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
相关产品推荐
相关产品推荐

