UseMethod 在 R 中的工作方式

una*_*der 5 r

h <- function(x) {
  x <- 10
  UseMethod("h")
}
h.character <- function(x){ paste("char", x)}
h.numeric <- function(x) { paste("num", x)}
h("a")
Run Code Online (Sandbox Code Playgroud)

上面的代码将输出:

[1] "char a"
Run Code Online (Sandbox Code Playgroud)

我的演绎推理,从下面来看,输出应该是“char 10”。

根据 UseMethod 的文档:

  1. 找到调用函数(通用函数)的上下文:这为我们提供了原始调用的未计算参数。

  2. 评估用于调度的对象(通常是参数),并找到一个方法(可能是默认方法)或抛出错误。

  3. 创建一个用于评估该方法的环境,并将特殊变量(见下文)插入该环境中。还要复制泛型环境中非形式(或实际)参数的任何变量。

  4. 将参数列表修复为与方法的形式匹配的调用参数。

如果我理解正确的话,在步骤 2 中,x 将被评估为“a”。但随后在步骤 3 中,另一个值为 10 的变量 x 被插入到环境中以执行该方法。

现在不会将 x 覆盖为 10 吗?最后在步骤 4 中,参数与方法的参数相匹配。因此 x(即 10)现在是该方法的参数。

我做错了什么

Sur*_*ren 10

来自?UseMethod

\n\n
\n

方法调度基于泛型函数的第一个参数的类或作为参数提供给\n \xe2\x80\x98UseMethod\xe2\x80\x99 或 \xe2\x80\ 的对象的类进行x98NextMethod\xe2\x80\x99。

\n
\n\n

所以在这种情况下

\n\n
h <- function(x) {\n  x <- 10\n  UseMethod("h")\n}\n\nh("a")\n#[1] "char a"\n
Run Code Online (Sandbox Code Playgroud)\n\n

要调用哪个函数取决于您使用\nh 调用时的类泛型函数的第一个参数的类)。"a"h("a")

\n\n

但如果你有

\n\n
h <- function(x) {\n  x <- 10\n  UseMethod("h", x)\n}\n\nh("a")\n#[1] "num a"\n
Run Code Online (Sandbox Code Playgroud)\n\n

当您调用它时,h("a")它将调用,h.numeric因为它是给定类 UseMethod (作为参数提供给\n \xe2\x80\x98UseMethod\xe2\x80\x99 的对象的 class(es) ... )

\n\n
\n\n

"char 10"因此,当您调用通用函数时,以下内容将作为输出给出。

\n\n
zz <- function(x) {\n\n   UseMethod("zz", "w")\n}\nzz.character <- function(x){ paste("char", x)}\nzz.numeric <- function(x) { paste("num", x)}\n\nzz(10)\n#[1] "char 10"\n
Run Code Online (Sandbox Code Playgroud)\n

  • 那么为什么 x &lt;- 10 并不重要呢? (2认同)