purrr::pmap()输出字符串变量名适配ggplot2::aes()的方法问询
解决方法
核心原因是ggplot2::aes()默认采用非标准求值逻辑,直接传入字符串会被识别为固定常量,而非数据框中的变量名,可通过以下两种成熟方案解决:
方案1:使用aes_string()(改造成本最低)
aes_string()是ggplot2专门提供的、支持接收字符串格式变量名的接口,你只需将原有代码中的aes()替换为aes_string()即可正常运行,修改后的pmap调用代码如下:
pmap(.l = list(eda_routine_combinations$num_1, eda_routine_combinations$num_2, eda_routine_combinations$fct) , .f = ~ mpg %>% ggplot(aes_string(x = ..1 , y = ..2, col = ..3)) + geom_point() )
方案2:使用.data代词(tidyverse官方推荐规范)
如果需要兼容最新版tidyverse的语法规范(aes_string()目前处于软弃用状态),可以用.data[[字符串变量]]的格式从数据集内取值,修改后代码如下:
pmap(.l = list(eda_routine_combinations$num_1, eda_routine_combinations$num_2, eda_routine_combinations$fct) , .f = function(x, y, col) { mpg %>% ggplot(aes(x = .data[[x]] , y = .data[[y]], col = .data[[col]])) + geom_point() })
该写法稳定性更强,不会随ggplot2版本更新出现兼容性问题。
你之前尝试的方案失效原因说明
cat()是控制台打印函数,没有返回可识别的变量对象,无法传入aes()作为参数as.name()生成的符号对象需要搭配!!注入运算符才能在aes()的求值环境中生效,如果你想沿用as.name()的思路,可以按如下写法调整:
mpg %>% ggplot(aes(x = !!as.name("displ") , y = !!as.name("cyl"), fill = !!as.name("drv"))) + geom_boxplot()
内容的提问来源于stack exchange,提问作者Hossam Ghorab
相关产品推荐
相关产品推荐

