我在R中编写的东西有点麻烦,我通常会在另一种语言的for循环中进行...
我现在正在尝试使用sp包中的spplot创建一个绘图(它是一个chloropleth地图),但我想为一堆变量做这个。在for循环中,我会像这样编程:
for (TRAIT in c("height","bmi","whr","body_fat","income")){
pdf("plot_of_TRAIT.pdf")
spplot(MyData, "TRAIT", col.regions = my.palette, cuts = 8, lwd = 0.5)
dev.off()
}
其中每个TRAIT实例应该由我给for循环的变量替换(所以在pdf的文件名中,并作为spplot命令中的参数)。现在,显然这段代码不起作用,但是如何在R中执行此操作?
更新
我得到了创建不同pdf文件的代码,但spplot命令仍然不起作用。它会创建空的pdf文件:
for (TRAIT in c("height","bmi","whr","body_fat","income")){
outfile <- paste0("plot_of_", TRAIT, ".pdf")
pdf(outfile)
spplot(MyData, TRAIT, col.regions = my.palette, cuts = 8, lwd = 0.5)
dev.off()
}
如果我在for循环之外运行完全相同的代码,如下所示:
pdf("plot_of_height.pdf")
spplot(MyData, "height", col.regions = my.palette, cuts = 8, lwd = 0.5)
dev.off()
它工作正常,我在plot_of_height.pdf文件中得到了所需的图。
更新2: 这似乎是spplot的一个问题。如果我运行这个:
TRAIT <- "height"
pdf("plot_of_height.pdf")
spplot(MyData, TRAIT, col.regions = my.palette, cuts = 8, lwd = 0.5)
dev.off()
我收到以下错误:
Error in [.data.frame(obj@data, zcol) : undefined columns selected
答案 0 :(得分:2)
您需要使用变量构造输出文件名。
例如:
outfile <- paste0("plot_of_", TRAIT, ".pdf")
pdf(outfile)
对于spplot
,您可能需要使用TRAIT
(无引号)。
修改强>
由于spplot(zcol = ...
可以是列号,我想知道这是否可行?
traits <- c("height","bmi","whr","body_fat","income")
for(i in 1:length(traits)) {
pdf(paste0("plot_of_", traits[i], ".pdf")
spplot(MyData, i, col.regions = my.palette, cuts = 8, lwd = 0.5)
dev.off()
}
答案 1 :(得分:1)
不看你的数据,我不能说你为什么会有未定义的列错误。复制您的更新2&#39;使用meuse数据集的代码不会为我抛出相同的错误:
library(sp)
demo(meuse, ask = FALSE, echo = FALSE)
TRAIT <- "copper"
my.palette <- c("black", "red", "green", "blue")
spplot(meuse, TRAIT, col.regions = my.palette, cuts = 8, lwd = 0.5)
至于你问题的第一个案例:spplot
(很像ggplot
)除非明确打印,否则不会在循环内向设备输出任何内容。基本上你打开一个pdf文件,创建图但不保存到pdf文件,然后
以下代码适合您:
for (TRAIT in c("height","bmi","whr","body_fat","income")){
outfile <- paste0("plot_of_", TRAIT, ".pdf")
pdf(outfile)
print(spplot(MyData, TRAIT, col.regions = my.palette, cuts = 8, lwd = 0.5))
dev.off()
}
我使用Meuse数据集对其进行了测试,它在那里运行良好:
library(sp)
demo(meuse, ask = FALSE, echo = FALSE)
my.palette <- c("black", "red", "green", "blue")
for(TRAIT in c("cadmium", "copper", "lead", "zinc")){
outfile <- paste0("plot_of_", TRAIT, ".pdf")
pdf(outfile)
print(spplot(meuse, TRAIT, col.regions = my.palette, cuts = 8, lwd = 0.5))
dev.off()
}
给我4个不同的pdf,每个pdf包含相应变量的空间图。