嗨,我正在尝试使用for循环创建图并在我的全局环境中分配它们,如下所示:
library(ggplot2)
library(patchwork)
datasets::anscombe
#> x1 x2 x3 x4 y1 y2 y3 y4
#> 1 10 10 10 8 8.04 9.14 7.46 6.58
#> 2 8 8 8 8 6.95 8.14 6.77 5.76
#> 3 13 13 13 8 7.58 8.74 12.74 7.71
#> 4 9 9 9 8 8.81 8.77 7.11 8.84
#> 5 11 11 11 8 8.33 9.26 7.81 8.47
#> 6 14 14 14 8 9.96 8.10 8.84 7.04
#> 7 6 6 6 8 7.24 6.13 6.08 5.25
#> 8 4 4 4 19 4.26 3.10 5.39 12.50
#> 9 12 12 12 8 10.84 9.13 8.15 5.56
#> 10 7 7 7 8 4.82 7.26 6.42 7.91
#> 11 5 5 5 8 5.68 4.74 5.73 6.89
for(i in 1:4){
var = paste0('p', as.character(i))
assign(
x = var,
value = (ggplot(anscombe,
aes(x=get(paste0('x', as.character(i))),
y=get(paste0('y', as.character(i))))) + geom_point()),
envir=.GlobalEnv
)
}
(p1 + p2)/(p3 + p4)
如您所见,所有生成的图都是相同的。但是,当我使用上面的相同代码而不使用for循环时,我得到了预期的图,例如:p1和p3如下所示。
p1 = ggplot(anscombe, aes(x=get(paste0('x', as.character(1))),
y=get(paste0('y', as.character(1))))) + geom_point()
p3 = ggplot(anscombe, aes(x=get(paste0('x', as.character(3))),
y=get(paste0('y', as.character(3))))) + geom_point()
p1 + p3
由reprex package(v0.3.0)于2020-09-06创建
我的问题是为什么for循环不起作用?为什么会在for
循环中为所有人生成p4图?
答案 0 :(得分:1)
您可以通过创建列名称并将其传递给ggplot,然后有选择地用!!
取消引号来简化此操作。
请注意,您已经在全局环境中,因此assign
不需要envir
参数。
for(i in 1:4) {
var = paste0('p', i)
x <- as.name(paste0("x", i))
y <- as.name(paste0("y", i))
assign(x = var, value = ggplot(anscombe, aes(!!x, !!y)) + geom_point())
}
(p1 + p2)/(p3 + p4)
顺便说一句,如果将所有图都保留在列表中,您可能会更简洁 避免将多个对象写入全局环境:
p <- lapply(1:4, function(i) {
ggplot(anscombe, aes(!!as.name(paste0("x", i)), !!as.name(paste0("y", i)))) +
geom_point()
})
(p[[1]] + p[[2]])/(p[[3]] + p[[4]])