您如何通过字符串从列表列表中将评估的 ggplots 存储在 R 中?

How do you store evaluated ggplots in R from a list of lists by string?

我制作了一系列包含 ggplot 的列表。我想评估对象以便尽早占用绘图时间。我已经收集了我想在字符串向量中评估的变量名称。另外,我想保留之前的变量名。

我尝试的解决方案是 lapply eval(as.symbol("myvarstring"))。据我所知,它计算变量而不存储计算后的表达式。

添加 as.symbol("myvarstring") <- eval(as.symbol("myvarstring")) 对我不起作用。

下面是我的失败解决方案的最小可重现示例。

library(tidyverse)

tbl <- tibble(
  x = 1:10,
  y = 1:10
)
g <- ggplot(tbl, aes(x, y)) + geom_point()

my_plot_list1 <- list(g,g,g,g,g,g)
my_plot_list2 <- list(g,g,g,g,g,g)
my_plot_list3 <- list(g,g,g,g,g,g)

my_vars <- c(
  "my_plot_list1",
  "my_plot_list2",
  "my_plot_list3"
)

lapply(my_vars, FUN = function(x) {as.symbol(x) <- eval(as.symbol(x))})

你会如何完成这个任务?

谢谢

编辑: 这些图表最终将通过 rmarkdown 脚本显示。这些图表将在 rscript 中 loaded。我的图表需要花费大量时间来绘制。如果我可以用 "rendered" 图表保存一个环境,它会缩短 rmarkdown 运行时间。 rmarkdown运行时间的缩短是最终目标。

base R中的get函数将从字符串中检索对象。例如:

get("tbl")
# # A tibble: 10 x 2
# x     y
# <int> <int>
# 1     1     1
# 2     2     2
# 3     3     3
# 4     4     4
# 5     5     5
# 6     6     6
# 7     7     7
# 8     8     8
# 9     9     9
# 10    10    10

所以在你的例子中:

 lapply(my_vars, FUN = function(x) { get(x)})

应该可以。

我相信有更好的方法,具体取决于您要对绘图执行的后续步骤。考虑这是否是处理数据的最佳方式。列表列表可以工作吗?将列表存储在向量中?

为什么不直接将列表存储在列表中,而不是依靠技巧从全局环境中获取它们?

library(tidyverse)

tbl <- tibble(
  x = 1:10,
  y = 1:10
)
g <- ggplot(tbl, aes(x, y)) + geom_point()

my_plot_list1 <- list(g,g,g,g,g,g)
my_plot_list2 <- list(g,g,g,g,g,g)
my_plot_list3 <- list(g,g,g,g,g,g)

my_vars <- list(
  my_plot_list1,
  my_plot_list2,
  my_plot_list3
)

lapply(my_vars, function(x) lapply(x, function(y) y))

如果您想确保绘图打印(例如,如果您要在函数或脚本中调用此代码),请将内部 function(y) y 替换为 function(y) print(y)

编辑:我相信我误解了。

如果要将变量分配给以编程方式生成的名称,您可以这样做:

x <- "mygeneratedname"
assign(x, g, envir = .GlobalEnv)