r - 第二级 R 函数中的子集化

标签 r list function dataframe subset

函数foo1可以通过请求的变量对列表进行子集化(例如,by = type == 1)。否则,foo1将简单地输出输入的列表本身。

出于我的目的,我需要在名为 foo2 的新函数中使用 foo1

在下面的代码中,我想要的输出是这样获得的: foo2(data = D, by = G[[1]]) ; foo2(数据 = D, by = G[[2]]) ; foo2(data = D, by = G[[3]]).

但是,我想知道为什么当我使用 lapply 循环 G 时,我收到错误如下所示?

foo1 <- function(data, by){

  L <- split(data, data$study.name) ; L[[1]] <- NULL

  if(!missing(by)){

   L <- lapply(L, function(x) do.call("subset", list(x, by)))
  }
 return(L)
}


foo2 <- function(data, by){

  eval(substitute(foo1(data = data, by = by)))
}

## EXAMPLE OF USE:
D <- read.csv("https://raw.githubusercontent.com/izeh/i/master/k.csv", h = T) ## Data

G <- lapply(unique(na.omit(D$type)), function(i) bquote(type == .(i)))# all levels of `type`

foo2(data = D, by = G[[1]]) # Works fine without `lapply` :-)

lapply(1:3, function(i) foo2(data = D, by = G[[i]])) # Doesn't work with `lapply`! :-(
# Error in do.call("subset", list(x, by)) : object 'i' not found

最佳答案

您的 foo2 函数尝试计算表达式

foo1(data = D, by = G[[i]])

但它没有可用的i。您需要在传递给 lapply 的匿名函数中计算 G[[i]] 以获取定义子集的表达式,然后在 中计算该子集>foo2。我建议命名该函数而不是使用匿名函数;它使调试变得更加容易。

以下是一些似乎有效的重新编码:

foo2 重新定义为

foo2 <- function(data, by){
  by <- eval(by, envir = data)
  foo1(data = data, by = by)
}

foo3 <- function(i) {
    expr <- G[[i]]
    foo2(data = D, by = expr)
}

然后

lapply(1:3, foo3)

我不确定这是否完全符合您的要求,但它应该足够接近,您可以修复它。

关于r - 第二级 R 函数中的子集化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58474393/

相关文章:

r - 使用r包 'flextable'将多个表格导出到word文档

R:匹配奇数次重复

C++ - 使用 std::list,如何打印对象私有(private)成员的链表?

python - 为什么我在这段 Python 代码上遇到断言错误?

python - 使用 Python range 内置函数从整数向后计数,与解析树相关

r - 将文本添加到使用 r 中的函数创建的绘图中

r - 您可以使用 dplyr cross() 来遍历成对的列吗?

list - 使用 tail 定义长度函数

java - 如何洗牌一个ArrayList

r - 如何过滤R中的列表