【问题标题】:Object not found - nested function - R找不到对象 - 嵌套函数 - R
【发布时间】:2018-08-29 06:58:54
【问题描述】:

我仍然习惯于使用函数。我查看了环境文档,但我无法弄清楚如何解决该错误。让我们看看我到现在为止的尝试:

我有一份文件清单。让我们假设它是“核心”

library(dplyr)
table_1 <- data.frame(replicate(10,sample(0:1,1000,rep=TRUE)))
table_2 <- data.frame(replicate(10,sample(0:1,1000,rep=TRUE)))

core <- list(table_1, table_2) 

然后,我必须为列表的每个元素运行函数documents_。该函数提供了一些参数,以便在另一个嵌套函数中执行:

documents_ <- function(i) {

  core_processed <- as.data.frame(core[[i]])

  x <- 1:nrow(core_processed)
  y <- 1:ncol(core_processed)

  temp <- sapply(x, function(x) mapply(calc_dens_,x,y))

  return(temp)

}

里面有calc_dens这个函数,就是:

calc_dens_ <- function(x, y) {

  core_temp <- core_processed %>%
    filter(X2 == x & X3 == y)

   return(core_temp)
}

然后,为了迭代列表的每个元素,我尝试了但没有成功:

calc <- lapply(c(1:2), function(i) documents_(i))

Error in eval(lhs, parent, parent) : object 'core_processed' not found

calc_dens 函数没有得到documents_ 的结果(环境问题。有没有办法解决这个问题,或者其他更好的方法?我的函数比这更复杂,但主要元素在这个例子。提前谢谢你。

【问题讨论】:

  • 我认为您应该包含您使用的软件包。 (dplyr?)。另外,如果我将calc_dens_ 放在documents_ 中,它在我的机器上运行良好。
  • 您应该明确地将core_processed 传递给calc_dens。该函数似乎无法通过可用的环境访问该变量。
  • core_processed 不是全局变量,它的作用域仅限于documents_ 函数内。请参阅上面的评论以获取解决方案。
  • 你说的都对。将完整的函数 calc_dens_ 放入documents_ 效果很好。

标签: r environment-variables nested-function


【解决方案1】:

正如其他评论者所说,问题在于您引用的变量 core_processed 不在范围内。您可以将其设为全局变量,但在这样的闭包中使用它可能更明智:

table_1 <- data.frame(replicate(10,sample(0:1,1000,rep=TRUE)))
table_2 <- data.frame(replicate(10,sample(0:1,1000,rep=TRUE)))
cores <- list(table_1, table_2)

documents_ <- function(core_processed) {
    x <- 1:nrow(core_processed)
    y <- 1:ncol(core_processed)
    calc_dens <- function(x, y) core_processed %>% filter(X2 == x & X3 == y)
    sapply(x, function(x) mapply(calc_dens, x, y))
}

calc <- lapply(cores, documents_)

如果cores 是数据框列表,则不需要使用as.data.frame,并且由于使用lapply,因此无需应用索引然后索引到列表中。所以我在这里写的代码被简化了,但和你的代码一样。

不过,我不得不怀疑,这真的是你想要的吗? sapply over x 然后mapply over xy -- 其中x 是来自sapply 的那个,而不是你在documents_ 中构建的那个 - 看起来很奇怪对我来说。

【讨论】:

  • 就是这样。上下文如下: 该表是网络的边缘列表。每个 x 是隶属关系的值。每个 Y 是特定年份的值。在这种情况下,我想过滤每个集群 (x),即每年 (y) 的网络度量。例如,对于集群 1,我将计算 2009 年至 2017 年间每年的传递性,并针对 x 内的每个集群继续。
  • 如果您想要xy 的所有组合,那么expand.grid(x, y) 可能是更好的方法。 sapply 中的 mapply 没有这样做。
  • 观察力不错。代码是错误的。按照此处link 的说明,我也将x 更改为Lx &lt;- 1:nrow(core_processed)y。之后,代码改为sapply(Lx, function(x) mapply(calc_dens,x,Ly))