函数传递data.frame和变量以构建公式

函数传递data.frame和变量以构建公式,r,function,dataframe,formula,vegan,R,Function,Dataframe,Formula,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,

我用纯素软件包做了一些分析和绘图,像这样

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)
如果我这样称呼它

plot_spcSurface(rdam,varespec,varespec$Cal.vul)
这是可行的,但是物种的名称不正确,标记为“speName”而不是“Cal.vu”,我无法从函数内部获取名称,正确的方法是什么

谢谢

试试这个:

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")
plot\u spc表面尝试以下方法:

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")
plot\u spc表面尝试以下方法:

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")
plot\u spc表面尝试以下方法:

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")

plot\u spcssurface你让这个问题变得比实际需要的更复杂;当您开始编写函数时,混淆公式和传递未赋值的参数总是会导致(如果不是问题的话)头痛

相反,请使用相应函数的默认版本,这些函数将排序对象和要打印的变量作为参数,而不是公式

这里有一个版本可以做到这一点:

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")

plot\u spcssurface你让这个问题变得比实际需要的更复杂;当您开始编写函数时,混淆公式和传递未赋值的参数总是会导致(如果不是问题的话)头痛

相反,请使用相应函数的默认版本,这些函数将排序对象和要打印的变量作为参数,而不是公式

这里有一个版本可以做到这一点:

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")

plot\u spcssurface你让这个问题变得比实际需要的更复杂;当您开始编写函数时,混淆公式和传递未赋值的参数总是会导致(如果不是问题的话)头痛

相反,请使用相应函数的默认版本,这些函数将排序对象和要打印的变量作为参数,而不是公式

这里有一个版本可以做到这一点:

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")

plot\u spcssurface你让这个问题变得比实际需要的更复杂;当您开始编写函数时,混淆公式和传递未赋值的参数总是会导致(如果不是问题的话)头痛

相反,请使用相应函数的默认版本,这些函数将排序对象和要打印的变量作为参数,而不是公式

这里有一个版本可以做到这一点:

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")
plot\u spc表面