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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:36:05