S3调度`rbind`和`cbind`

rvl*_*rvl 14 r

我正在尝试rbind为特定类编写方法.这是一个简单的例子,它不起作用(至少对我而言):

rbind.character <- function(...) {
    do.call("paste", list(...))
}
Run Code Online (Sandbox Code Playgroud)

输入此函数后,我似乎可以确认它是R知道的有效方法:

> methods("rbind")
[1] rbind.character  rbind.data.frame rbind.rootogram* rbind.zoo*      
see '?methods' for accessing help and source code
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用它,则无法识别:

> rbind("abc", "xyz")
     [,1] 
[1,] "abc"
[2,] "xyz"
> #### compared with ####
> rbind.character("abc", "xyz")
[1] "abc xyz"
Run Code Online (Sandbox Code Playgroud)

帮助页面表示调度内部执行如下:

  1. 对于每个参数,我们从class属性中获取可能的类成员资格列表.
  2. 我们轮流检查每个班级,看看是否有适用的方法.
  3. 如果我们找到适用的方法,我们确保它与先前参数确定的任何方法相同.如果它是相同的,我们继续,否则我们立即转到默认代码.

有了rbind("abc", "xyz"),我相信所有这些标准都是满意的.给出了什么,我该如何解决?

Rol*_*and 9

attributes("abc")
#NULL
Run Code Online (Sandbox Code Playgroud)

一个character向量没有一个类属性.我不认为可以rbind为隐式类调度方法.

  • 这是一个隐含的类.`rbind`的方法dispatch只检查类属性,即显式类. (5认同)
  • 似乎误导了`class("abc")````character"`. (2认同)
  • 这似乎可能是[rbind]的来源(https://github.com/wch/r-source/blob/b156e3a711967f58131e23c1b1dc1ea90e2f0c43/src/main/bind.c#L1039).它似乎是测试它是否首先是一个对象.这与其他函数的调度方式有些不同. (2认同)