在另一类的方法中使用一个类中的方法

时间:2020-06-03 17:38:10

标签: r

我正在尝试在另一个类(列表)的方法中使用一个类(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

2 个答案:

答案 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

相关问题