如何通过字符串变量为qic()函数指定数据框列参数?
如何在qic()函数中用字符串变量指定数据框列名?
问题重现
我尝试用字符串变量给qicharts2包的qic()函数指定y参数对应的列,试了几种类似ggplot2的写法都不行,代码和报错如下:
my_fun <- function(y){ require(qicharts2) qic(x = i, y = .data[[y]], # 以为和ggplot2的用法一致 n = n, data = nhs_accidents, chart = 'p', title = 'Proportion of patients seen within 4 hours', ylab = NULL, xlab = 'Week #') } my_var <- "r" my_fun(my_var)
报错信息:
Error: ! Can't subset
.dataoutside of a data mask context. Runrlang::last_trace()to see where the error occurred.
还试了其他几种写法,也都报错:
y = as.symbol(my_var)Error in stats::complete.cases(y, n) : invalid 'type' (symbol) of argument
y = {{my_var}}Error in if (y.name == "NULL") y.name <- deparse(substitute(x)) : the condition has length > 1
y = rlang::as_label(my_var)Error in stats::complete.cases(y, n) : not all arguments have the same length
解决方法
qic()虽然基于ggplot2,但参数解析逻辑没完全兼容.data这类tidy eval语法。要通过字符串传列名,推荐用rlang的符号转换+注入的方式:
library(qicharts2) library(rlang) my_fun <- function(y){ # 把字符串转成R能识别的符号对象 y_col <- sym(y) qic(x = i, y = !!y_col, # 用!!注入符号 n = n, data = nhs_accidents, chart = 'p', title = 'Proportion of patients seen within 4 hours', ylab = NULL, xlab = 'Week #') } my_var <- "r" my_fun(my_var)
如果不想依赖rlang,也可以用base R的get()函数,明确指定数据框的环境:
my_fun <- function(y){ require(qicharts2) qic(x = i, y = get(y, envir = as.environment(nhs_accidents)), n = n, data = nhs_accidents, chart = 'p', title = 'Proportion of patients seen within 4 hours', ylab = NULL, xlab = 'Week #') }
为什么之前的方法不行?
.data只能在ggplot2的aes()或支持tidy eval的特定上下文里用,qic()的参数没实现这个机制,所以报错;as.symbol()直接传符号的话,qic()内部的处理逻辑没正确解析这个符号,导致类型错误;{{}}是用来传递表达式(比如直接传列名)的,不是用来传字符串的,所以会出现长度不匹配;as_label()只是把变量转成文本标签,不是实际的列数据,自然会报错长度不匹配。
内容的提问来源于stack exchange,提问作者MCornejo
相关产品推荐
相关产品推荐

