你能“绑定”或者提供一个替代实现的数据框架在R?

在Perl(也可能是其他langauges)中,您可以“绑定”一个变量,以用用户定义的行为来替换它的内置行为.例如,可以使用自定义“get”和“fetch”子例程来绑定哈希表,例如查询BerkeleyDB,以便数据是持久性的,而不受RAM限制,但仍然看起来像Perl的常规哈希.

与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"

相关文章

安装 在Windows上安装SQLite。 访问官网下载下Precompliled Binaries for Windows的两个压缩包。 创建s...
一、安装 下载地址:http://www.sqlite.org/download.html 将Precompiled Binaries for Windows下的包下...
实例: 会员信息管理 功能:1.查看数据库 2.清空数据库 3.增加会员 4.删除会员 5.更新会员 6.查找会员  ...
关于SQLite SQLite是一个轻量的、跨平台的、开源的数据库引擎,它的在读写效率、消耗总量、延迟时间和整...