您如何通过字符串从列表列表中将评估的 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 中 load
ed。我的图表需要花费大量时间来绘制。如果我可以用 "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)
我制作了一系列包含 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 中 load
ed。我的图表需要花费大量时间来绘制。如果我可以用 "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)