gpt4 book ai didi

r - 为什么在使用 data.table 分组时不能在 lapply 中使用 FUN

转载 作者:行者123 更新时间:2023-12-04 11:39:27 24 4
gpt4 key购买 nike

我在聚合、使用 .SD 和指定 lapply 时遇到了 data.table 的以下问题,并从 lapply 中明确说明了 FUN 参数。
这是意外行为还是我只是错过了一些东西。为什么我不能在 lapply 中明确说明 FUN?
下面是一个可重现的示例。

require(data.table)
dt <- as.data.table(iris)
dt$Sepal.Length[sample(1:nrow(dt), 10)] <- NA
dt[, lapply(.SD, function(x) sum(!is.na(x), na.rm=TRUE)), by = Species]
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1: setosa 47 50 50 50
2: versicolor 46 50 50 50
3: virginica 47 50 50 50
dt[, lapply(.SD, FUN=function(x) sum(!is.na(x), na.rm=TRUE)), by = Species]
Error in ..FUN(FUN = Sepal.Length) :
unused argument(s) (FUN = Sepal.Length)

更新:

Filed as bug: #4839 . (Arun 现在在 v1.8.9 中修复)

最佳答案

我不认为你缺少任何东西。您可能应该提交一个错误 here链接到这个帖子。接得好!

发生这种情况是因为,当您使用 lapply 时与 .SD (在 j 中),data.table如果可能,尝试查找是否有一种方法可以优化由于函数调用而导致的开销。但是,在这个过程中,不是调用函数:

..FUN(Sepal.Length)

哪里 ..FUN = function(x) sum(!is.na(x), na.rm=TRUE) , 它成为了:
..FUN(FUN = Sepal.Length)

由于该函数没有名为 FUN 的参数它返回错误。您可以通过更改 x 来验证这一点。至 FUN在您的函数调用中:
dt[, lapply(.SD, FUN=function(FUN) sum(!is.na(FUN), na.rm=TRUE)), by = Species]
#       Species Sepal.Length Sepal.Width Petal.Length Petal.Width
# 1:     setosa           49          50           50          50
# 2: versicolor           44          50           50          50
# 3:  virginica           47          50           50          50

内部:通过查看 [.data.table函数,解决此问题的一种方法是重写该行:
txt <- as.list(jsub)[-1L]
# [[1]]
# .SD

# $FUN <~~~~ this name FUN gets caught up in building the expression later
# function(x) sum(!is.na(x), na.rm = TRUE)

和:
txt <- as.list(jsub)[-1L]
names(txt)[2] <- ""
# [[1]]
# .SD

# [[2]]
# function(x) sum(!is.na(x), na.rm = TRUE)

运行 CHECK成功完成。

关于r - 为什么在使用 data.table 分组时不能在 lapply 中使用 FUN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18314757/

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