R动态命名要在ggplot2中使用的数据框

R dynamically naming a data frame to be used in ggplot2

是的,我知道有很多关于在 R 中动态命名变量的问题,是的,我已经复习过了,不,我仍然不能做我想做的事情。

我创建了五个不同的数据框,每个数据框都包含来自另一个数据框的选定信息。我想将这些较小的数据帧中的每一个发送到 ggplot。我已经创建了框架,但我似乎无法让 ggplot 解析动态数据框架名称。我试过各种版本的赋值,as.name.

这是我截断的代码:

Alist <- unique(bigdf$initial.A)
Blist <- unique(bigdf$initial.B)

for ( i in Alist ) { 
    for ( j in Blist ) {
        assign( paste0("a", i, "b", j ), bigdf %>%
        filter( initial.A == i, initial.B == j ))
    }
}

效果很好,我创建了正确数量的数据帧,正确命名并包含正确的信息:a5b10、a5b20、a5b30、a10b10、a10b20 和 a10b30。

for (i in Alist) { 
    for (j in Blist ) { 
        png(paste0("a", i, "b", j, ".png"))
        useframe <- as.name(paste0("a", i, "b", j))
        ggplot(useframe, aes(step)) + . . . 
    }
}

错误通常是这样的:ggplot2 不知道如何处理 class 字符(或 class 名称)的数据。

如何创建动态名称并为其分配匹配内容 data.frame?

如果您希望我使用列表,我需要更好地了解它在此处的应用方式。

get 应该可以解决您的问题:

for (i in Alist){ 
  for (j in Blist){ 
    png(paste0("a", i, "b", j, ".png"))
    useframe <- paste0("a", i, "b", j)
    ggplot(get(useframe), aes(x = step)) + geom_density()
  }
}

但是您可以轻松地消除所有这些混乱,并使用 doParalleldata.table:

进行二进制搜索
library(doParallel)
library(data.table)
bigDT <- setDT(bigdf)
setkeyv(bigDT, c("intial.A", "initial.B"))

foreach(i = seq(Alist)) %do% {
  foreach(j = seq(Blist)) %do% {
    x <- bigDT[J(c(Alist[i], Blist[i]))]
    png(paste0("a", i, "b", j, ".png"))
    ggplot(x, aes(step)) + . . .     
  }
}

为什么不能将所有数据放在一起并使用分面网格?

编辑:

library(ggplot2)
library(dplyr)
library(magrittr)

plot_data = function(sub_df) {
  filename = 
    sub_df %>%
    use_series(gear) %>%
    first %>%
    sprintf("gear_%s.pdf", .)

  (ggplot(sub_df) +
    aes(x = wt, y = mpg) + 
    geom_point() ) %>%
    ggsave(filename, .)

  data_frame()
}

mtcars %>%
  group_by(gear) %>%
  do(plot_data(.) )