非标准使用r函数未列为方法

时间:2017-03-28 07:17:10

标签: r oop methods documentation operator-overloading

在某些情况下,R函数在特定上下文中以非标准方式使用,其中该方式未列为方法或以不寻常的方式列出。例如,在公式中使用*不是通常意义上的乘法​​,但方法(*)[& - 不可见的反引号*]不显示方法。类似地,在ggplot2中,+用于添加参数,这通常不是通常意义上的添加。 +确实有一个方法,但它没有显示为+,ggplot_obj-method或其他任何方式,而是显示为+.gg*,如果你想看到它,你必须知道要剪掉* ,将它包装在反引号中,并在它前面加上一个三重冒号,我发现由于各种原因而令人困惑,其中明确地导出了这个+变体。

getAnywhere(),我通常认为这是一种绝望的举动,对*的公式使用甚至没有任何回忆。它也没有在ggplot2中找到+,虽然它确实找到了+.gg*,或者(正如我所做的)猜测,你必须在结尾处剪掉*。

在这两个实例中我都知道上下文是什么,所以我有点知道如何鼠标移动直到我发现在上下文的帮助中记录的用法,而不是函数。但我发现这些例子很令人不安,因为如果我不了解上下文,只是发现了一些R代码并试图理解它,我不知道如何使用任何R帮助函数来了解有问题的上下文。 ?? +和?? *都返回:[Markdown \ escape似乎不适用于代码块中括号内的反引号。]

Error in if (nchar(Outfile)) Outfile else File :   argument is not interpretable as logical

如果我知道的话,是否有其他帮助机制可以帮助我找到这些不寻常的用法?

P.S。 stackoverflow真的应该有一个帮助系统的[help]标签,它不仅仅是文档。我还没有代表创建新标签,或者我愿意。

1 个答案:

答案 0 :(得分:0)

methods()在其文档中提到,您既可以提供泛型函数(例如,在您的情况下为+),也可以将函数名称作为字符串提供。 methods("+")似乎给了我正确的结果。

> methods("+")   
[1] +.Date   +.POSIXt
> library(ggplot2)
> methods('+')
[1] +.Date   +.gg*    +.POSIXt

您可以找到有关常规S3术语和程序here

的更多信息

加载ggplot2时,您可以看到对+.gg*的引用。这意味着+函数为类gg的对象重载。星号用于突出显示该功能不可见。但是,当您检查ggplot对象的类时,您可以看到它确实是类'gg'的元素。

> p <- ggplot(data.frame())
> class(p)
[1] "gg"     "ggplot"

由于+.gg不可见(因此是星号),我确实可以使用getAnywhere()来查看来源。

> getAnywhere('+.gg')
A single object matching ‘+.gg’ was found
It was found in the following places
  registered S3 method for + from namespace ggplot2
  namespace:ggplot2
with value

function (e1, e2) 
{
    e2name <- deparse(substitute(e2))
    if (is.theme(e1)) 
        add_theme(e1, e2, e2name)
    else if (is.ggplot(e1)) 
        add_ggplot(e1, e2, e2name)
}
<environment: namespace:ggplot2>