【问题标题】:"unused arguments" error when using a method使用方法时出现“未使用的参数”错误
【发布时间】:2020-06-05 04:49:12
【问题描述】:

这对我来说真的是个谜。我已经这样定义了我的方法(对于“graf”类):

addStatistics <- function(x) UseMethod("addStatistics")
addStatistics.graf <- function (x, stat_name = NULL, value = NULL)
{
    if (stat_name == "env_coef_delta_mnll") {
        x$env_coef_delta_mnll <- value
    }
    x
}

我正在调用这样的方法,并得到一个错误:

addStatistics(m, "env_coef_delta_mnll", 0)
#Error in addStatistics(m, "env_coef_delta_mnll", 0) : 
#  unused arguments ("env_coef_delta_mnll", 0)

为什么该方法不接受这些提供的参数并说它们“未使用”?

【问题讨论】:

  • 签名必须匹配。在泛型签名的末尾添加...
  • @G.Grothendieck 哪些签名?函数调用完全符合定义。
  • 它没有。。泛型只有x,方法有额外的args。

标签: r


【解决方案1】:

这是解决问题的一种方法。显然您正在创建一个 setter 函数,所以我将稍微更改一下泛型。

`addStatistics<-` <- function(x, ...) UseMethod("addStatistics<-")
`addStatistics<-.graf` <- function (x, stat_name = NULL, value = NULL)
{
  if (stat_name == "env_coef_delta_mnll") {
    x$env_coef_delta_mnll <- value
  }
  x
}

as.graf <- function(x){
  class(x) <- "graf"
  x
}
x <- as.graf(list())

addStatistics(x, "env_coef_delta_mnll") <- 1234
x
#$env_coef_delta_mnll
#[1] 1234
#
#attr(,"class")
#[1] "graf"

【讨论】:

  • 好的,谢谢,这肯定好多了!但是,为什么我在问题中的代码不起作用?
  • @TMS 由于 G.Grothendiek 在他的 cmets 中所说,泛型的签名必须具有点参数才能预测更多参数,具体取决于方法。除非您事先知道可以为该泛型编写的所有可能方法。
【解决方案2】:

@GGrothendieck 击败了我,但这里有一个例子来证明这一点;

addStatistics <- function(...) UseMethod("addStatistics")

addStatistics.graf <- function (x, stat_name, value)
{
  if(!missing(stat_name)){
    if (stat_name == "env_coef_delta_mnll") {
        x$env_coef_delta_mnll <- value
    }}
    x
}

m <- list(env_coef_delta_mnll = 3)
class(m) <- "graf"

addStatistics(m, stat_name = "env_coef_delta_mnll", 4)
#> $env_coef_delta_mnll
#> [1] 4
#> 
#> attr(,"class")
#> [1] "graf"

reprex package (v0.3.0) 于 2020 年 2 月 20 日创建

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-26
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    相关资源
    最近更新 更多