我正在调试一个较大的R包。它创建了许多对象但不清理内存。是否有一种方法可以在R中进行引用计数,检查哪个对象被访问了多少次。这将给我一个大致的想法,哪些对象在代码的后续部分中创建但从未被使用。值得注意的是,这些对象中的大多数都是data.table。
我正在调试一个较大的R包。它创建了许多对象但不清理内存。是否有一种方法可以在R中进行引用计数,检查哪个对象被访问了多少次。这将给我一个大致的想法,哪些对象在代码的后续部分中创建但从未被使用。值得注意的是,这些对象中的大多数都是data.table。
引用计数是一种机制,用于确定有多少R对象指向相同的底层SEXPREC(R对象的C结构)。例如,在
a <- 1:5
b <- a
a
和b
指向同一个SEXPREC,如果其中一个被修改,SEXPREC需要被复制以不改变另一个对象的值。然而,如果对象的引用计数没有增加,这并不意味着它对计算没有影响。例如,在以下情况下:
a <- 1:5
b <- a+1
a
是相关的,但是因为它们指向不同的 SEXPREC,所以 a
和 b
的引用计数都很低。因此,无法使用 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