r - 在嵌入式纯素中找不到数据对象 :cca. 范围问题?

标签 r scoping vegan

我尝试将cca(以及capscale)从包vegan(版本2.5-7,R 4.1.2)嵌入另一个函数通过一些数据转换然后改变模型公式来测试分析管道。使用的数据矩阵(例如 bioenv)可以具有不同的名称,并且通常在全局工作空间中不可见。我得到的错误是:

Error in eval(match.call()$data, environment(formula), enclos = .GlobalEnv) : 
object 'env' not found

这看起来像是一个范围界定问题。环顾四周,vegan 似乎在过去的范围界定方面遇到了一些问题,这些问题是 said to be fixed ,所以我想知道我是否忽略了一些事情。任何解决方法也是受欢迎的,例如环境操纵。

library("vegan")

## create some example data
set.seed(123)
bio <- matrix(sample(0:10, 50, replace = TRUE), nrow = 10)
env <- data.frame(
  x = sample(1:10, 10),
  y = 1:10 + rnorm(10),
  z = rnorm(10)
)
cca(bio ~ x + y, data = env) # works

## enclose cca with some other stuff in a function
foo <- function(model, bio, env) {
  ## do preparatory data transformation
  fm <- cca(model, data = env)
  print(fm)
  ## do something else
}

model <- formula(bio ~ x + y) # works
foo(model, bio=bio, env=env)

## now rename data to test scoping
bio2 <- bio
env2 <- env
rm(bio, env)

foo(model, bio = bio2, env = env2) # error
# Error in eval(match.call()$data, environment(formula), enclos = .GlobalEnv) :
# object 'env' not found

最佳答案

是的,看起来是一个范围问题。我认为关键是更新函数内公式的环境:

foo <- function(model, bio, env) {
  # update model environment
  environment(model) = environment()
  ## do preparatory data transformation
  fm <- cca(model, data = env)
  print(fm)
  ## do something else
}

关于r - 在嵌入式纯素中找不到数据对象 :cca. 范围问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71524098/

相关文章:

javascript - 如何使数组在Javascript中的不同函数下可访问?

java - Java知识不足,但找不到搜索方向

r - 在 ggplot2 中绘制 envfit 向量(vegan 包)

R vegan RDA 并非所有级别的约束都显示在三图中

r - downloadHandler在使用R Shiny下载图像时出错

java - Rcaller 将 q 字符添加到 StringBuffer 的末尾

r - 如何使用名称向量重命名 tidyverse 中的列

r - ggplot2 boxplot中的标签框

types - Ocaml 中 "type ...and "和 "let ...and "之间的范围不一致

r - 如何解释cca素食主义者的输出