在嵌入式 vegan:cca 中找不到数据对象。范围问题?
Data objects not found in embedded vegan:cca. Scoping issue?
我尝试将包 vegan(版本 2.5-7,R 4.1.2)中的 cca
(以及 capscale
)嵌入到另一个函数中通过一些数据转换测试分析管道,然后改变模型公式。使用的数据矩阵(例如 bio
和 env
)可以有不同的名称,并且通常在全局工作 space 中不可见。我得到的错误是:
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
}
我尝试将包 vegan(版本 2.5-7,R 4.1.2)中的 cca
(以及 capscale
)嵌入到另一个函数中通过一些数据转换测试分析管道,然后改变模型公式。使用的数据矩阵(例如 bio
和 env
)可以有不同的名称,并且通常在全局工作 space 中不可见。我得到的错误是:
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
}