传入字符串"df1"至ggplot2绘图函数报错:需传入数据框类型对象
解决pmap传递ggplot2绘图参数时的
data类型错误 你遇到的错误是因为params数据框中存储的是数据框和列名的字符串,但gen_plots函数需要的是实际的data.frame对象和列的符号/表达式,pmap直接传递字符串导致ggplot无法识别数据输入。以下是两种可行的解决方案:
方案一:修改params存储实际对象与列符号
直接在params中存储实际的数据框对象和列符号,和你测试函数时的参数形式一致:
library(tidyverse) library(ggthemes) # 示例数据框 df1 <- tibble( date = seq(ymd('2023-01-01'), ymd('2023-06-30'), by='1 month'), A = runif(6, 1, 20), B = runif(6, 1, 20), C = runif(6, 1, 20) ) # 绘图函数保持不变 gen_plots <- function(df, x, y, title){ df |> ggplot(mapping = aes(x = {{x}}, y = {{y}})) + geom_line() + geom_point() + labs(title = {{title}}, y = "$/MWh", x = NULL) } # 修改后的params:存储实际对象和列符号 params <- tibble( df = list(df1, df1, df1), # 存入实际数据框对象 x = list(date, date, date),# 存入列的符号 y = list(A, B, C), title = c("Segment A", "Segment B", "Segment C") ) # 生成图形列表 plots <- pmap(params, gen_plots)
这种方法避免了字符串转对象的操作,更符合tidyverse的编程风格,也不会有环境变量查找的问题。如果有多个源数据框(比如df2、df3),只需在df列的list中添加对应的对象即可。
方案二:修改绘图函数支持字符串参数
如果希望保留params中的字符串格式,可以修改gen_plots函数,将字符串转换为可识别的对象和列:
library(tidyverse) library(ggthemes) # 示例数据框 df1 <- tibble( date = seq(ymd('2023-01-01'), ymd('2023-06-30'), by='1 month'), A = runif(6, 1, 20), B = runif(6, 1, 20), C = runif(6, 1, 20) ) # 修改后的绘图函数:支持字符串参数 gen_plots <- function(df_name, x_col, y_col, title){ # 从字符串获取数据框对象 df <- get(df_name) df |> ggplot(mapping = aes(x = .data[[x_col]], y = .data[[y_col]])) + geom_line() + geom_point() + labs(title = title, y = "$/MWh", x = NULL) } # 原params调整参数名以匹配函数形参 params <- data.frame( df_name = c("df1", "df1", "df1"), x_col = c("date", "date", "date"), y_col = c("A", "B", "C"), title = c("Segment A", "Segment B", "Segment C") ) # 生成图形列表 plots <- pmap(params, gen_plots)
注意这里要确保df_name对应的对象存在于当前环境中(比如全局环境),如果数据框在其他环境中,需要调整get的envir参数。
内容的提问来源于stack exchange,提问作者DavidH
相关产品推荐
相关产品推荐

