使用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
相关产品推荐
相关产品推荐

