Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:选择子集而不复制_R_Immutability_Subset_Apply_Copy On Write - Fatal编程技术网

R:选择子集而不复制

R:选择子集而不复制,r,immutability,subset,apply,copy-on-write,R,Immutability,Subset,Apply,Copy On Write,是否有一种方法可以从对象(数据帧、矩阵、向量)中选择子集,而无需复制所选数据 我处理相当大的数据集,但从不更改它们。然而,为了方便起见,我经常选择要操作的数据子集。每次复制一个大型子集的内存效率非常低,但普通索引和子集(因此xapply()函数族)都会创建所选数据的副本。所以我正在寻找能够克服这个问题的函数或数据结构 一些可能适合我的需要并有望在一些R包中实现的方法: 写时复制机制,即仅在添加或重写现有元素时复制的数据结构 不可变的数据结构,只需要重新创建数据结构的索引信息,而不需要重新创建其

是否有一种方法可以从对象(数据帧、矩阵、向量)中选择子集,而无需复制所选数据

我处理相当大的数据集,但从不更改它们。然而,为了方便起见,我经常选择要操作的数据子集。每次复制一个大型子集的内存效率非常低,但普通索引和
子集
(因此
xapply()
函数族)都会创建所选数据的副本。所以我正在寻找能够克服这个问题的函数或数据结构

一些可能适合我的需要并有望在一些R包中实现的方法:

  • 写时复制机制,即仅在添加或重写现有元素时复制的数据结构
  • 不可变的数据结构,只需要重新创建数据结构的索引信息,而不需要重新创建其内容(如仅通过创建包含长度的小对象和指向同一字符数组的指针,从字符串生成子字符串)
  • xapply()
    不创建子集的类似物
试试包装。具体来说,它的
refdata

关于
data.table
您可能缺少的是,当分组(
by=
parameter)时,数据子集不会被复制,所以这很快。[从技术上讲,它们只是进入一个共享的内存区域,每个组都可以重复使用,并使用memcpy进行复制,这比C中循环的R快得多。]

:=
数据中。表格
是就地修改
数据的一种方法。表格
<代码>数据。表与通常的R编程风格不同,它不会在写入时复制。用户必须显式调用
copy()
来复制(可能非常大的)表,即使在函数中也是如此

您是对的,没有像
refdata
这样的机制内置在
data.table
中。我明白你的意思,这将是一个很好的功能
refdata
应该适用于
数据表
,但您可能可以使用
data.frame
(但请确保使用
TraceM(DF)
)监视副本)


在包
plyr
中还有
idata.frame
(不可变的
data.frame
),你可以试试。

我想你应该看看
data.table
包(可能有人会很快出现在这里,向你提供更多细节…)数据库接口显然是你应该研究的。r中几乎所有的东西都是按承诺传递的,在需要对子集执行任何操作时,它都会成为有效的按值传递。@BenBolker:谢谢,
data.table
似乎是一个不错的包,但不幸的是,在大多数情况下它不适合我的需要。特别是,
data.table
有另一个索引模型,使得执行选择变得更加困难(也更加缓慢),例如
data[1:50,1:10]
(即通过行和列进行选择)和许多线性代数运算。我曾考虑使用矩阵而不是数据帧来节省空间和时间,但矩阵也有其局限性,所以我也在寻找替代选项。@dwn:关于“传递值”。你的意思是R使用惰性评估吗?但它与我看到的不一致:code
DF不确定你所说的永久性是什么意思。完全有可能在函数的环境中创建一个对象,并使其在退出时自动成为可回收的垃圾。我的理解是R确实使用惰性评估。如果您想控制此过程,可以使用
delayedAssign
force
功能。我们中的大多数人并不怎么考虑它(直到它在功能评估时咬到我们为止)