我正在调试大型R包。它正在创建多个对象,但没有清除内存。有没有一种方法可以在R中进行引用计数,检查哪个对象已被访问了多少次。这将使我大致了解已创建但在以后的代码部分中从未使用过的对象。仅供参考,其中大多数对象都是data.table
答案 0 :(得分:0)
引用计数是一种机制,用于确定有多少R对象指向同一基础SEXPREC(R对象的C结构)。例如在
a <- 1:5
b <- a
a
和b
指向相同的SEXPREC,如果同时修改了两者之一,则需要复制SEXPREC才能不更改另一个对象的值。但是,如果不增加对象的参考计数,则并不意味着它与计算无关。例如在
a <- 1:5
b <- a+1
a
是相关的,但是a
和b
都将具有较低的引用计数,因为它们指向的是不同的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