使用Tidyverse解引用运算符创建未求值调用
解决方法
问题核心是赋值表达式的非标准求值构造规则:expr(!!sym(res) <- ...)的写法不符合rlang的解析逻辑,赋值运算符<-的左侧无法直接通过!!插入符号,导致无法识别res变量。以下是两种可行的解决方案:
方法一:用rlang::call2直接构造赋值调用
call2可以直接构造任意函数调用,包括赋值操作,完美适配这种场景:
library(dplyr) library(rlang) d <- tibble(x = paste0("x", 1:3), op = c("f", "g", "h"), y = paste0("y", 1:3), res = paste0("z", 1:3)) # 生成标准的<-赋值表达式 D <- d %>% rowwise() %>% mutate(cmd = list(call2("<-", sym(res), call2(sym(op), sym(x), sym(y))))) %>% ungroup()
方法二:用expr结合:=替代赋值
如果可以接受临时用:=作为赋值符号,之后通过eval_tidy求值,也可以用这种写法:
D <- d %>% rowwise() %>% mutate(cmd = list(expr(!!sym(res) := !!sym(op)(!!sym(x), !!sym(y))))) %>% ungroup() # 求值时用eval_tidy自动处理:= eval_tidy(D$cmd[[1]], e)
验证效果
用提供的环境测试求值功能:
e <- list2env(list(x1 = 1, x2 = 2, x3 = 3, y1 = 2, y2 = 2, y3 = 3, f = \(x, y) x + y, g = \(x, y) x - y, h = \(x, y) x * y)) eval(D$cmd[[1]], e) e$z1 # [1] 3
内容的提问来源于stack exchange,提问作者thothal
相关产品推荐
相关产品推荐

