与R类似吗?特别是,我在想,因为一个data.frame看起来像一个关系数据库中的一个表,如果一个data.frame绑定到像sqlite这样的东西,它会使R处理非常大的数据帧(我已经填充100GB到sqlite)没有任何代码更改.
data.table和dplyr在处理非常大的数据框架和查询时非常好.如果data.frame实际上> 100GB,我宁愿建议在限制中使用data.table看起来优于dulr> Inf.如果您需要,两者都对stackoverflow有很好的支持.
然而,要真正回答你的问题(并且对未来的这个问题的读者有用):是的,可以用R额外收取一个功能来提供替代行为.它实际上很容易与S3调度系统.我建议this ressource了解更多.
我会给你的浓缩版本:
如果你有一个类“myclass”的对象,你可以编写一个函数f.myclass来做你想要的.
然后定义通用函数f:
f <- function(obj,...) UseMethod("f",obj,...)
当您调用f(obj)时,UseMethod将调用的函数取决于obj的类.
如果obj是类“myclass”,那么将在obj上调用f.myclass.
如果你想重新定义的函数已经存在,那么你可以简单地定义plot.myclass,当你在“myclass”对象上调用plot时,它将被使用.通用函数已经存在,无需重新定义它.
要更改对象的类(或将新类附加到现有类,这是更常见的,不会破坏您不想更改的行为),您可以使用类< - . 这是一个愚蠢的例子.
> print.myclass <- function(x) { print("Hello!")} > df <- data.frame(a=1:3) > class(df) [1] "data.frame" > df #equivalent to print(df) a 1 1 2 2 3 3 > class(df) <- append(class(df),"myclass") > class(df) [1] "data.frame" "myclass" > class(df) <- "myclass" > class(df) [1] "myclass" > df [1] "Hello!" > str(df) # checking the structure of df: the data is still there of course List of 1 $a: int [1:3] 1 2 3 - attr(*,"row.names")= int [1:3] 1 2 3 - attr(*,"class")= chr "myclass"
有一些细微之处,如果有几个类,按照什么顺序等等,调用哪个函数.我引用你对S3系统的一个彻底的解释.
这就是你如何重新定义函数的行为.将它们重写为f.myclass,然后创建类“myclass”的对象.
或者,您可以重新定义f.targetclass.例如,再次使用print和data.frame:
> print.data.frame <- function(x) { print(paste("data.frame with columns:",paste(names(x),collapse = ",")))} # less silly example! > df <- data.frame(a=1:3,b=4:6) > df [1] "data.frame with columns: a,b"