0

我正在使用 vegan 包做一些分析和绘图,像这样

require(vegan)
data(varechem)
data(varespec)

rdam <- rda(varechem,scale=T)


scal=2
ef <- envfit(rdam ~ Cal.vul, data = varespec)
sf <- ordisurf(rdam ~ Cal.vul, data = varespec, plot = FALSE, scaling = scal)
plot(rdam, type="po",scaling = scal)
spe.sc <- scores(rdam, choices=1:2, display="sp",scaling = scal)
arrows(0, 0, spe.sc[, 1], spe.sc[, 2], length=0, lty=1, col="red")
ordilabel(rdam,dis="sp",cex=0.8,col="red",scaling = scal)
plot(ef)
plot(sf, col = "darkgreen", add = TRUE)

但我必须重复相同的情节,只改变变量 Cal.vul 所以我想做一个函数:

plot_spcSurface <- function(rdam,speFram, speName, scal=2 )
{
  ef <- envfit(rdam ~ speName, data = speFram)
  sf <- ordisurf(rdam ~ speName, data = speFram, plot = FALSE, scaling = scal)
  plot(rdam, type="po",scaling = scal)
  spe.sc <- scores(rdam, choices=1:2, display="sp",scaling = scal)
  arrows(0, 0, spe.sc[, 1], spe.sc[, 2], length=0, lty=1, col="red")
  ordilabel(rdam,dis="sp",cex=0.8,col="red",scaling = scal)
  plot(ef)
  plot(sf, col = "darkgreen", add = TRUE)

}  

plot_spcSurface(rdam,varespec,Cal.vul)

它给

objeto 'Cal.vul' not found 

如果我这样称呼它

plot_spcSurface(rdam,varespec,varespec$Cal.vul)

它有效,但是物种的名称不正确,标记为“speName”而不是“Cal.vul”,我无法从函数内部获取名称,正确的方法是什么?

谢谢

4

2 回答 2

2

你让这变得比它真正需要的更复杂;当您开始编写函数时,弄乱公式并传递未评估的参数总是会导致头痛,如果不是问题的话。

相反,请使用相应函数的默认版本,它们将一个排序对象和一个变量作为参数而不是公式作为参数进行绘制。

这是一个可以做到这一点的版本:

plot_spcSurface <- function(ord, speFrame, speName, scal=2 ) {
  ef <- envfit(ord, speFrame[[speName]])
  sf <- ordisurf(ord, speFrame[[speName]], plot = FALSE, scaling = scal)
  plot(ord, type="po", scaling = scal)
  spe.sc <- scores(ord, choices=1:2, display="sp", scaling = scal)
  arrows(0, 0, spe.sc[, 1], spe.sc[, 2], length=0, lty=1, col="red")
  ordilabel(ord, dis="sp", cex=0.8, col="red", scaling = scal)
  plot(ef, labels = speName)
  plot(sf, col = "darkgreen", add = TRUE)
  invisible()
}

plot_spcSurface(rdam, varespec, "Cal.vul")

## or in the development version of vegan >= 2.1-41
plot_spcSurface(rdam, varespec, "Callvulg")

现在唯一的问题是,由于我没有考虑从返回的内部对象上没有存储标签的情况,所以envfit()上面的函数没有正确标记箭头。应该,但是有一个我没有考虑到的极端情况,我plot.envfit()现在将修复 R-forge这已在 R-forge 的 r2862 中修复。(请注意,在那个版本中,Jari 更改了物种代码,因此您"Callvulg"现在需要而不是"cal.vulg"。)

于 2014-03-15T15:32:40.557 回答
1

尝试这个:

plot_spcSurface <- function(rdam,speFram, speName, scal=2 )
{
  form <- as.formula(paste("rdam~",speName))
  ef <- envfit(form, data = speFram)
  sf <- ordisurf(form, data = speFram, plot = FALSE, scaling = scal)
  plot(rdam, type="po",scaling = scal)
  spe.sc <- scores(rdam, choices=1:2, display="sp",scaling = scal)
  arrows(0, 0, spe.sc[, 1], spe.sc[, 2], length=0, lty=1, col="red")
  ordilabel(rdam,dis="sp",cex=0.8,col="red",scaling = scal)
  plot(ef)
  plot(sf, col = "darkgreen", add = TRUE)

}  

plot_spcSurface(rdam,varespec,"Cal.vul")

这会将预测变量的名称作为字符串传递,并在内部构建公式。

于 2014-03-14T21:55:02.663 回答