如何将R的S3类与参数一起使用?

时间:2019-09-21 13:56:08

标签: r function arguments

我担心我弄错了。基础知识来自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)

答案G后,

编辑。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问题确实有用!

1 个答案:

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