NSE场景下外部向量的自定义函数适配方案问询
实现方法
步骤1:编写辅助标记函数extvecfn
这个函数的作用是给需要取值的向量元素表达式打上特殊标记,方便sfn识别:
extvecfn <- function(expr) { structure(list(expr = substitute(expr)), class = "extvec") }
步骤2:修改原函数sfn
在原逻辑基础上增加对标记类的判断,遇到标记过的对象就直接求值获取实际元素值:
sfn <- function(x) { if (inherits(x, "extvec")) { val <- eval(x$expr, envir = parent.frame()) as.character(val) } else { gsub('"', "", deparse(substitute(x))) } }
验证测试
# 测试基础场景 sfn(mpg) # 返回 "mpg" sfn("mpg") # 返回 "mpg" # 测试外部向量元素 x <- c("mpg", "cyl") sfn(extvecfn(x[1])) # 返回 "mpg" # 测试直接传入向量对象 sfn(x) # 返回 "x"
原理说明
extvecfn通过substitute捕获传入的表达式(比如x[1]),并将其包装为带有自定义extvec类的结构,相当于给这个表达式加了个“需要求值”的标签。- 修改后的
sfn会先检查输入是否属于extvec类:如果是,就回到调用它的环境中对捕获的表达式求值,拿到向量元素的实际内容;如果不是,就沿用原来的逻辑解析符号或去除引号的字符串。
内容的提问来源于stack exchange,提问作者mharinga
相关产品推荐
相关产品推荐

