R创建含嵌套tibble时外部列引用内部列名报错如何解决
嵌套tibble存储内部列名+传参ggplot的实现方案
报错根因
初始代码写yvar = c(freq)时,R会在tibble构造的顶层执行环境搜索freq对象,但freq是内层嵌套tibble的列,顶层环境不存在该对象,因此触发object 'freq' not found报错。
具体实现
你猜测的quosure(tidy eval)方向是对的,同时也可以用更简便的字符串+.data代词方案,两种方案都可正常运行:
方案1:字符串存储列名(推荐,易读易维护)
- 构造嵌套tibble时,
yvar直接存储内层列名的字符串值:
library(tidyverse) tib <- tibble( dat = list(tibble(xvar = 1, freq = 2, rate = 3.2)), yvar = "freq" )
- 修正原绘图函数的语法错误(原代码缺失闭合括号),用
.data[[ ]]代词映射字符串形式的列名,同时兼容多行嵌套数据的批量绘图场景:
plot_datapoint <- function(input_tib = tib){ input_tib %>% mutate(plot = pmap(list(dat, yvar), function(inner_df, y_col){ ggplot(inner_df, aes(x = xvar, y = .data[[y_col]])) + geom_point(size = 3) })) } # 调用测试 result <- plot_datapoint() # 提取生成的图形对象 result$plot[[1]]
方案2:quosure存储列引用(标准tidy eval实现)
如果需要严格使用quosure机制存储裸列名,构造tibble时用quo()包裹列名生成引用,绘图时用!!注入即可:
- 构造嵌套tibble:
tib_quo <- tibble( dat = list(tibble(xvar = 1, freq = 2, rate = 3.2)), yvar = list(quo(freq)) )
- 适配绘图函数:
plot_datapoint_quo <- function(input_tib = tib_quo){ input_tib %>% mutate(plot = pmap(list(dat, yvar), function(inner_df, y_col){ ggplot(inner_df, aes(x = xvar, y = !!y_col)) + geom_point(size = 3) })) }
两种方案都支持多行嵌套数据的扩展:比如你后续新增行指定
yvar = "rate",代码会自动为每一行数据生成对应y轴的散点图,不需要额外修改逻辑。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

