R 如何调度 plot
函数?标准泛型定义为
plot <- function (x, y, ...) UseMethod("plot")
所以通常,所有绘图方法都需要参数
x
和 y
。然而,存在具有不同参数的各种其他函数。一些函数只有参数 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), ...)
这适用于带有
x
和 y
的数据框和绘图。但是,如果我尝试绘制 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
然后“缺失”。我们也不能交换 a
和 b
:> 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/