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

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

这看起来像是一个范围问题.环顾四周,似乎vegan在过go 的范围界定中有一些问题,比如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相关问答推荐

使用sensemakr和fixest feols模型(R)

geom_Ribbon条件填充创建与数据不匹配的形状(ggplot 2 r)

在(g)子中使用asserable字符

咕噜中的元素列表:map

如何直接从Fortran到R的数组大小?

在组中添加值增加和减少的行

删除具有相同标题的tabPanel(shinly)

使用across,starts_with和ifelse语句变更多个变量

在rpart. plot或fancyRpartPlot中使用带有下标的希腊字母作为标签?

try 将 colored颜色 编码添加到ggploly的标题中

仅 Select 超过9行的CSV文件

如何基于两个条件从一列中提取行

如何在ggplot2中创建多个y轴(每个变量一个)

根据r中另一个文本列中给定的范围对各列求和

对R中的列表列执行ROW Mean操作

使用列名和r中的前缀 Select 列的CREATE函数

识别部分重复行,其中一行为NA,其重复行为非NA

R,将组ID分配给另一个观测ID变量中的值的组合

在分面的ggplot2条形图中对条形图进行排序,并省略每组未使用的系数级别

如何修复geom_rect中的层错误?