我正在尝试在另一个类(列表)的方法中使用一个类(data.frame)的方法,在这种情况下,是多个数据帧的列表。
这不起作用,由于某些范围设定问题,我强烈假设。就我而言,foo.data.frame
不再找到funs
。如果尝试了一些尝试来重新定义funs
(请参见代码中的注释),则无济于事。
因此,我的问题是,如何使funs
中的foo.data.frame
可以访问foo.list
。还是有充分的理由说明这是不好的编程风格。 (我仍在考虑自己是编程初学者)。干杯。
更新
我可以在全球环境中定义funs
-我很乐意这样做。但是,是否有一种方法可以访问useMethod创建的环境,这种环境是方法中的一种?
set.seed(42)
mydf <- cbind(a = rep(letters[1:3], 4), setNames(as.data.frame(replicate(c(rnorm(11), NA), n = 3)), letters[24:26]))
mydf_grouped <- split(mydf, mydf$a)
foo <- function(x) {
funs <- list(
mean = function(x) mean(x, na.rm = TRUE)
)
UseMethod("foo", x)
}
foo.data.frame <- function(x, ...) {
suppressWarnings(lapply(funs, mapply, x))
}
## works
foo(mydf)
#> $mean
#> a x y z
#> NA 0.6161670 -0.4570349 0.2275039
## works with a simple function
foo.list <- function(x, ...){
lapply(x, nrow)
}
foo(mydf_grouped)
#> $a
#> [1] 4
#>
#> $b
#> [1] 4
#>
#> $c
#> [1] 4
## fails with the method for data.frames
foo.list <- function(x, ...){ ## adding funs argument does not help
# funs <- funs ## does not work
# funs <- list(
# mean = function(x) mean(x, na.rm = TRUE)
# ) ## Defining funs within foo.list does not work either
lapply(x, foo.data.frame ) ## adding funs here does also not help
}
foo(mydf_grouped)
#> Error in lapply(funs, mapply, x): object 'funs' not found
答案 0 :(得分:2)
问题是您正在直接调用foo.data.frame
,并且该函数没有定义funs
。您需要通过通用的foo
来调用它:
foo.list <- function(x) {
lapply(x, foo)
}
之所以可行,是因为foo
中的lapply
将调用泛型,该泛型在使用data.frames列表进行调用的情况下会正确地分派到适当的方法(foo.data.frame
),像foo(mydf_grouped)
中一样。
答案 1 :(得分:1)
请参阅上面接受的答案以获取解释。
如果将foo赋值从方法声明中移到foo.data.frame中,它将起作用:
set.seed(42)
mydf <- cbind(a = rep(letters[1:3], 4), setNames(as.data.frame(replicate(c(rnorm(11), NA), n = 3)), letters[24:26]))
mydf_grouped <- split(mydf, mydf$a)
foo <- function(x) {
UseMethod("foo", x)
}
foo.data.frame <- function(x, ...) {
funs <- list(
mean = function(x) mean(x, na.rm = TRUE)
)
suppressWarnings(lapply(funs, mapply, x))
}
foo.list <- function(x, ...){
lapply(x, foo.data.frame )
}
foo(mydf_grouped)
返回:
$a $a$mean a x y z NA 0.8631572 -0.2024425 0.1406371 $b $b$mean a x y z NA 0.2624452 -1.2436714 0.3381285 $c $c$mean a x y z NA 0.7584759 0.2523572 0.1958268
Blockquote