首页 > 解决方案 > R对象引用计数

问题描述

我正在调试一个大型 R 包。它正在创建几个对象但不清理内存。有没有办法在 R 中进行引用计数,检查哪个对象被访问了多少次。这将使我对已创建但从未在代码的后面部分中使用的对象有一个粗略的了解。仅供参考,这些对象中的大多数都是 data.table

标签: rdata.tablereference-counting

解决方案


引用计数是一种机制,用于确定有多少 R 对象指向相同的底层 SEXPREC(R 对象的 C 结构)。例如在

a <- 1:5
b <- a

ab指向同一个 SEXPREC,如果两者之一被修改,则需要复制 SEXPREC 以不更改另一个对象的值。但是,如果一个对象的引用计数没有增加,这并不意味着它与计算无关。例如在

a <- 1:5
b <- a+1

a是相关的,但两者ab具有低引用计数,因为它们指向不同的 SEXPREC。因此,R 的引用计数不能用于检查对象是否已创建但从未使用过

只是为了好玩,可以使用词法范围来计算 R 对象被访问的次数:

obj <- function(x){
    n <- 0
    get <- function() {n <<- n+1; x}
    count <- function() n
    list(get=get, count=count)
}

然后创建一个新的 R 对象

a <- obj(1:10)

并使用

a$get()
 [1]  1  2  3  4  5  6  7  8  9 10

可以计算对象被访问了多少次。

a$count()
[1] 1
max(a$get())
[1] 10
a$count()
[1] 2

如果对象有计数0,则它已创建但从未使用过

b <- obj(2)
b$count()
[1] 0

推荐阅读