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

时间:2018-06-01 21:20:14

标签: r ggplot2 lazy-evaluation

我制作了一系列包含ggplots的列表。我想评估这些物体,以便尽早咬住绘图时间。我收集了我想在字符串向量中评估的变量名称。另外,我想保留变量名称。

我尝试的解决方案是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脚本显示。图表将在{rs}中load。我的图表需要花费大量时间来绘制。如果我可以使用&#34;渲染&#34;来保存环境图表,它会缩短rmarkdown运行时。缩短rmarkdown运行时的运行时间是最终目标。

2 个答案:

答案 0 :(得分:2)

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

def add_trick(self, trick):
    DogStr.tricks = trick

如果您想确保打印图表(例如,如果您要在函数或脚本中调用此代码),请将内部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)

答案 1 :(得分:1)

基础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)})

应该有用。

我认为有更好的方法取决于您想要对图表做什么的后续步骤。考虑这是否是处理数据的最佳方式。列表列表可以工作吗?将列表存储在向量中?