我已经清理了您生成示例数据框的方式。
library(ggplot2)
library(cowplot)
df <- data.frame(group=c(rep("A", 4), rep("B", 4)),
a=sample(1:100, 8),
b=sample(100:200, 8),
c=sample(300:400, 8)) #make data frame
只需使用 data.frame() 就足够了。这使您的代码更加清晰,并避免了在“for 循环”中进行所有后处理以将数据帧转换为数字并删除生成的因素的需要 - 请注意,as.data.frame() 和 cbind() 往往是默认的如果您没有 'stringsAsFactors = FALSE' 并且可以通过使用 cbind.data.frame() 而不是 cbind() 来避免数字到字符的转换,则为因子。
我还重构了生成绘图的“for 循环”。您生成一个名为“cols”(cols
i) 在检查代码时,所使用的条件立即显而易见,无需搜索代码的其余部分
ii) R 有许多与变量“cols”类似命名的函数/参数,最好避免混淆。
清理完代码后,我们现在可以尝试找出错误的原因:
library(ggplot2)
library(cowplot)
df <- data.frame(group=c(rep("A", 4), rep("B", 4)),
a=sample(1:100, 8),
b=sample(100:200, 8),
c=sample(300:400, 8)) #make data frame
for (i in 2:ncol(df)){
g <- ggplot(df, aes(x=group, y=df[,i])) +
geom_boxplot() +
ggtitle(colnames(df)[i])
print(g)
assign(colnames(df)[i], g) #generate an object for each plot
}
您的代码不起作用的原因并不是很明显。 Imo的建议有其道理。将绘图保存到列表中可以防止您的环境因对象而变得混乱,但这并不能解决此错误。原因并不直观,需要深入了解 allocate() 函数的计算方式。查看提供的答案here by 康拉德·鲁道夫。以下内容应该可以工作并保留原始代码的风格。正如康拉德在他的回答中所建议的那样,使用 lapply 可能更“R”。请注意,我们已经给出了for loop本地范围,我们现在在本地重新定义 i 。以前,循环中生成的 i 的最后一个值用于生成通过 allocate() 函数创建的每个对象。请注意使用
for (i in 2:ncol(df))
local({
i <- i
g <<- ggplot(df, aes(x=group, y=df[,i])) +
geom_boxplot() +
ggtitle(colnames(df)[i])
print(i)
print(g)
assign(colnames(df)[i], g, pos =1) #generate an object for each plot
})
plot_grid(a, b, c)
你欠我一杯酒。