You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传入字符串"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:23:16