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

使用rlang在R函数中编写for循环报错,Base R实现正常

问题分析与解决

你遇到的错误是因为enquo()将输入表达式转换为quosure(引用对象),而for循环需要可迭代的向量或列表,quosure无法直接作为循环序列使用。

错误原因

在你的rlang写法中,controls = enquo(controls)把c(CRT1, CRT2)转换成了quosure对象,这个对象不属于可遍历的向量类型,因此触发invalid for() loop sequence错误。而Base R写法中传入的是字符向量c("CRT1", "CRT2"),本身就是可迭代结构,所以能正常运行。

正确实现方式

方式一:直接传入多个符号(推荐tidyverse风格)

用ensyms()捕获多个符号参数,转换为字符后遍历:

library(rlang)
library(dplyr)
library(R.utils)

db <- tibble(
  CRT1 = 15*rnorm(10),
  CRT2 = 12*rnorm(10))

f_rlang <- function(data, ...){
  # 捕获所有传入的符号参数
  controls <- ensyms(...)
  for (i in controls) {
    printf("The control variable is %s\n", as.character(i))
  }
}

# 调用时直接传入变量名,无需c()包裹
f_rlang(db, CRT1, CRT2)

方式二:保留c(CRT1, CRT2)的调用格式

对捕获的quosure在数据环境中求值,提取变量名后遍历:

f_rlang <- function(data, controls){
  controls <- enquo(controls)
  # 在数据框环境中求值表达式,获取变量名
  control_names <- names(eval_tidy(controls, data))
  for (i in control_names) {
    printf("The control variable is %s\n", i)
  }
}

# 按原方式调用
f_rlang(db, c(CRT1, CRT2))

两种方式都能输出:

The control variable is CRT1
The control variable is CRT2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:15:38