我担心我弄错了。基础知识来自here 并且我认为一个基本的(最小)示例可以正常工作:
fun.default <- function(x) { # you could add further fun.class1 (works)...
print("default")
return(x[1] + x[2])
}
my_fun <- function(x) {
print("my_fun")
print(x)
res <- UseMethod("fun", x)
print(res)
print("END my_fun...")
return(res)
}
x <- c(1, 2)
my_fun(x)
但是,如果我想添加参数,那确实会出错。形成上面的链接:
一旦UseMethod找到正确的方法,就会以特殊方式调用它 办法。与其创建新的评估环境,不如使用 当前函数调用的环境(对泛型的调用),因此 在致电之前所做的任何作业或评估 该方法可以访问UseMethod。
我尝试了所有我能想到的变体:
my_fun_wrong1 <- function(x, y) {
print("my_fun_wrong1")
print(x)
x <- x + y
print(x)
res <- UseMethod("fun", x)
print(res)
print("END my_fun_wrong1...")
return(res)
}
x <- c(1, 2)
# Throws: Error in fun.default(x, y = 2) : unused argument (y = 2)
my_fun_wrong1(x, y = 2)
my_fun_wrong2 <- function(x) {
print("my_fun_wrong2")
print(x)
x <- x + y
print(x)
res <- UseMethod("fun", x)
print(res)
print("END my_fun_wrong2...")
return(res)
}
x <- c(1, 2)
y = 2
# Does not throw an error, but does not give my expetced result "7":
my_fun_wrong2(x) # wrong result!?
rm(y)
my_fun_wrong3 <- function(x, ...) {
print("my_fun_wrong3")
print(x)
x <- x + y
print(x)
res <- UseMethod("fun", x)
print(res)
print("END my_fun_wrong3...")
return(res)
}
x <- c(1, 2)
# Throws: Error in my_fun_wrong3(x, y = 2) : object 'y' not found
my_fun_wrong3(x, y = 2)
编辑。Grothendieck:使用fun.default <- function(x, ...)
我得到
更改后运行,但是我不明白结果:
my_fun_wrong1(x, y = 2)
[1] "my_fun_wrong1"
[1] 1 2
[1] 3 4 # Ok
[1] "default"
[1] 3 # I excpect 7
和以前一样-我不明白结果:
my_fun_wrong2(x) # wrong result!?
[1] "my_fun_wrong2"
[1] 1 2
[1] 3 4 # Ok!
[1] "default"
[1] 3 # 3 + 4 = 7?
仍然抛出错误:
my_fun_wrong3(x, y = 2)
[1] "my_fun_wrong3"
[1] 1 2
Error in my_fun_wrong3(x, y = 2) : object 'y' not found
我认为,this问题确实有用!
答案 0 :(得分:2)
fun.default
需要...
,以便匹配额外的参数。
fun.default <- function(x, ...) {
print("default")
return(x[1] + x[2])
}
x <- c(1, 2)
my_fun_wrong1(x, y = 2)
## [1] "my_fun_wrong1"
## [1] 1 2
## [1] 5 6
## [1] 3
此外,在泛型中UseMethod
调用之后的任何语句都不会被评估为UseMethod
不会返回,因此将代码放在泛型中毫无意义。
此外,您无法将参数重新定义为UseMethod
。参数传入后即传递。
建议仔细阅读帮助文件?UseMethod
,尽管公认它可能很难阅读。
关于添加到问题中的?UseMethod
中的引号,这仅意味着方法可以访问在调用UseMethod
的函数中定义的局部变量。它不是不是意味着您可以重新定义参数。 ff.default
下面是a
中定义的ff
。
a <- 0
ff <- function(x, ...) { a <- 1; UseMethod("ff") }
ff.default <- function(x, ...) a
ff(3)
## [1] 1