使用包eHOF绘制用于循环的循环

时间:2014-06-26 14:39:17

标签: r for-loop plot

我想使用R包eHOF运行一个(~100)个eHOF模型,生成这个包可以制作模型的图形,并保存每个模型的jpeg文件。我试图使用for循环来快速完成这个,但我无法让它来制作图表。我在R studio plot窗口中看不到任何内容,我生成的jpeg文件中没有任何内容(作为旁白问题,我没有在循环中正确生成jpeg文件的名称)。

要生成这些图,在循环外没有问题,例如我调用我的模型modSP< -HOF(Sp,...)然后使用plot(ModSp)生成所需的图形。但是在循环中,什么都没有产生,我得到了几个类似的错误消息:

1: In xy.coords(x, y, xlabel, ylabel, log) : NAs introduced by coercion
2: In plot.window(...) : "boxp" is not a graphical parameter
3: In plot.window(...) : "las.h" is not a graphical parameter
4: In plot.window(...) : "onlybest" is not a graphical parameter
5: In plot.window(...) : "para" is not a graphical parameter

背景:我在R studio中使用R版本3.1.0(2014-04-10),并在Windows 7中使用eHOF。

我的代码如下:

species<- read.csv("F:/Thesis_projects/Chapter4_climateChange/HOF/259species.csv")
species<-as.data.frame(species)
enviro<-read.csv("F:/Thesis_projects/Chapter4_climateChange/HOF/EnvironmentalData.csv")
enviro<-as.data.frame(enviro)
species_enviro<-merge(enviro, species, all.x=FALSE)
HOF_Sp<-species_enviro[,23:25]
GDD<-species_enviro[,19]
library(eHOF)

SpeciesCodes<-c("ACPE","ACRU2","ACSP2")
Modx<-NULL
for (Spp in seq_along(SpeciesCodes)){

  Modx[[Spp]]<-HOF(HOF_Sp[[Spp]],GDD, M=1,family=binomial, bootstrap=2, freq.limit = 100)

  jpeg(filename = (paste(("GDD_responsecurve_",SpeciesCodes[[Spp]],".jpg"),sep="")),
     width =8.3, height = 8.3, units = "cm", pointsize = 8, bg="white", res = 800)

  print(plot((paste(c(Modx[[Spp]]))), boxp = TRUE,
    las.h = 1, onlybest = TRUE, para = TRUE,
    gam.se = FALSE, newdata = NULL, lwd=1, leg = TRUE, add=FALSE, 
    xlabel="Growing degree days", ylab="Probability"))

   dev.off()
                                    }

我的数据如下:

> head(GDD)
[1] 996.1681 996.1681 962.0662 962.0662 945.7007 945.7007

(物种数据中也有很多1,而不是前几行)。

   > head(HOF_Sp)
      ACMI2 ACPA ACPE
    1     0    0    0
    2     0    0    0
    3     0    0    0
    4     0    0    0
    5     0    0    0
    6     0    0    0

任何建议都将非常感谢!我认为循环中的情节函数被误认为R的通用情节函数是一个问题。如果我没有提供足够的信息,我将很乐意编辑我的问题。

1 个答案:

答案 0 :(得分:0)

这里有几件事情发生了:

  1. 您的SpeciesCodes向量的代码与HOF_Sp中的列名不同。
  2. seq_along(...)返回其参数中每个元素的索引,而不是元素本身。
  3. plot类的对象传递给HOF时,会调用HOF的{​​{1}}方法。但是你传递的是plot(...),这是不可理解的......
  4. 您的示例不可重现,因为它不会与您提供的数据一起运行(您是否尝试运行它?)。具体而言,paste(c(HOF))的样本是简并的,因为没有非零值。
  5. 由于上面的(4),我不可能测试这段代码,但试试这个:

    HOF_Sp

    请注意,这会调用SpeciesCodes <- c("ACPE","ACRU2","ACSP2") for (Spp in SpeciesCodes) { model <- HOF(HOF_Sp[[Spp]],GDD, M=1,family=binomial, bootstrap=2, freq.limit = 100) jpeg(filename = (paste(("GDD_responsecurve_",Spp,".jpg"),sep="")), width =8.3, height = 8.3, units = "cm", pointsize = 8, bg="white", res = 800) plot(model, boxp = TRUE, las.h = 1, onlybest = TRUE, para = TRUE, gam.se = FALSE, newdata = NULL, lwd=1, leg = TRUE, add=FALSE, xlabel="Growing degree days", ylab="Probability") dev.off() } 的矢量版本,我收集的是你想要的。

    这不能解决上面(1)中的问题(物种代码与列名称不匹配),但除此之外它应该有效。