gpt4 book ai didi

r - 在二级 R 函数中进行子集化

转载 作者:行者123 更新时间:2023-12-01 01:40:23 26 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

这里可以使用 lapply 循环而不是使用 for

lst1 <- vector("list", length(G))
for(i in 1:3) lst1[[i]] <- foo2(data = D, by = G[[i]])

-检查
identical(lst1[[2]],  foo2(data = D, by = G[[2]]))
#[1] TRUE
identical(lst1[[3]], foo2(data = D, by = G[[3]]))
#[1] TRUE

对于 lapply 部分,似乎与 i 匿名函数存在冲突,该函数也在 G 中调用。如果我们使用新变量,请说 'j'
lst2 <- lapply(1:3, function(j) foo1(data = D, by = G[[j]]))

应该管用
identical(lst2[[2]], lst1[[2]])
#[1] TRUE

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com