R 如何调度 plot 函数?标准泛型定义为

plot <- function (x, y, ...)  UseMethod("plot")

所以通常,所有绘图方法都需要参数 xy 。然而,存在具有不同参数的各种其他函数。一些函数只有参数 x :
plot.data.frame <- function (x, ...)

其他人甚至既没有 x 也没有 y :
plot.formula <- function(formula, data = parent.frame(), ..., subset,
                         ylab = varnames[response], ask = dev.interactive())

这是如何工作的,它在哪里记录?

背景

在我的包 ( see GitHub ) 中,我想用我自己的版本替换 R 包 graphics 中定义的函数 plot.data.frame 。然而,这通常是不允许的



正如布赖恩里普利上次告诉我的那样,我试图做这样的事情。一个可能的解决方案如下:



对于其他方法,我可以轻松实现(例如 toLatex ),但是,使用 plot 我遇到了问题。我在我的代码中添加了以下内容:
## overwrite standard generic
plot <- function(x, y, ...)
    UseMethod("plot")

## per default fall back to standard generic
plot.default <- function(x, y, ...)
    graphics::plot(x, y, ...)

## now specify modified plot function for data frames
plot.data.frame <- function(x, variables = names(x), ...)

这适用于带有 xy 的数据框和绘图。但是,如果我尝试绘制 formula 等,则它不起作用:
Error in eval(expr, envir, enclos) :
  argument "y" is missing, with no default

我也尝试使用
plot.default <- function(x, y, ...)
    UseMethod("graphics::plot")

但后来我得到
Error in UseMethod("graphics::plot") :
  no applicable method for 'graphics::plot' applied to an object of class "formula"

所以后续问题是我该如何解决这个问题?

[编辑:] 使用我下面的解决方案修复了包中的问题。然而,plot.formula 之后被破坏了:
library("devtools")
install_github("hofnerb/papeR")
example(plot.formula, package="graphics") ## still works

library("papeR")
example(plot, package = "papeR") ## works
### BUT
example(plot.formula, package="graphics") ## is broken now

最佳答案

感谢@Roland,我解决了部分问题。

似乎参数的位置用于方法调度(而不仅仅是名称)。然而,名称被部分使用。所以以罗兰为例

> plot.myclass <- function(a, b, ...)
>    print(b)
> x <- 1
> y <- 2
> class(x) <- "myclass"

我们有
> plot(x, y)
[1] 2
> plot(a = x, b = y)
[1] 2

但是如果我们使用标准参数名称
> plot(x = x, y = y)
Error in print(b) (from #1) : argument "b" is missing, with no default

它不起作用。正如人们所见,x 被正确用于调度,但 b 然后“缺失”。我们也不能交换 ab :
> plot(b = y, a = x)
Error in plot.default(b = y, a = x) :
  argument 2 matches multiple formal arguments

然而,如果想要调度的参数是第一个没有名称的 (?) 元素,则可以使用不同的顺序:
> plot(b = y, x)
[1] 2

解决实际问题:

我不得不使用
plot.default <- function(x, y, ...)
    graphics::plot(x, y, ...)

真正的问题是在我的 plot.data.frame 方法内部,我使用了以下内容:
plot(x1 ~ y1)

不指定数据。通常这在默认情况下作为 data = parent.frame() 工作。不知何故,在这种情况下,这是行不通的。我现在使用 plot(y1, x1) ,它就像一个魅力。所以这是我的草率。

关于r - R 中通用 `plot` 函数的方法调度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32222368/

10-13 09:20