max*_*eld 12 oop inheritance r class-method
我想在我的泛型中设置一些标志(在调用之前UseMethod(),我知道很多:)),然后在方法中使用和/或更新这些标志.
像这样:
g <- function(x) {
y <- 10
UseMethod("g")
}
g.default <- function(x) {
c(x = x, y = y)
}
g.a <- function(x) {
y <- 5 # update y from generic here
NextMethod()
}
Run Code Online (Sandbox Code Playgroud)
这直接跳转到默认方法时有效:
g(structure(.Data = 1, class = "c")) # here y is never updated
# x y
# 1 10
Run Code Online (Sandbox Code Playgroud)
但是当我经历时NextMethod(),y神秘地消失了:
g(structure(.Data = 1, class = "a")) # here y is updated, but cannot be found
# Error in g.default(structure(.Data = 1, class = "a")) :
# object 'y' not found
Run Code Online (Sandbox Code Playgroud)
我已经找到了解决这个问题的方法,只需要经过y很多方法:
f <- function(x, ...) {
y <- 10
UseMethod("f")
}
f.default <- function(x, ..., y = 3) {
c(x = x, y = y)
}
f.a <- function(x, ...) {
y <- 5
NextMethod(y = y)
}
Run Code Online (Sandbox Code Playgroud)
产量
f(structure(.Data = 1, class = "c"))
# x y
# 1 3
f(structure(.Data = 1, class = "a"))
# x y
# 1 5
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么没有NextMethod()在上面g().*-example杀死另外y的说法?
我想整点UseMethod()和NextMethod()是在任何对象通过调用从调用,而不需要手动把它们:
NextMethod的工作原理是为下一个方法创建一个特殊的调用框架.如果没有提供新的参数,那么参数的数量,顺序和名称将与当前方法的参数相同,但它们的值将是在当前方法和环境中评估其名称的承诺.
我特别困惑,UseMethod()似乎确实传递了y,但NextMethod()没有.
正如@Roland指出的那样,记录了这种行为:
从help("UseMethod")关于UseMethod()注释的段落(强调添加):
UseMethod创建一个新的函数调用,其参数在进入泛型时匹配.保留在调用UseMethod之前定义的任何局部变量(与S不同).调用UseMethod之后的任何语句都不会被评估,因为UseMethod不会返回.
关于NextMethod()(上文已经引用过)的各段仅仅注明:
NextMethod的工作原理是为下一个方法创建一个特殊的调用框架.如果没有提供新的参数,那么参数的数量,顺序和名称将与当前方法的参数相同,但它们的值将是在当前方法和环境中评估其名称的承诺.与...匹配的任何命名参数都是专门处理的:它们要么替换同名的现有参数,要么附加到参数列表中.它们作为作为当前环境的参数提供的promise传递.(S以不同的方式做到这一点!)如果他们已经在当前(或以前的环境)中进行了评估,他们仍然会被评估.(这是一个复杂的领域,可能会有变化:参见草案'R语言定义'.)
总之,然后UseMethod()做一些特别和非凡的事情:它传递局部变量.
NextMethod(),按照惯例,不这样做.
UseMethod()是例外,不是NextMethod().