R - 如何从函数列表中删除元素

Posted

技术标签:

【中文标题】R - 如何从函数列表中删除元素【英文标题】:R - how remove an element from a list in a function 【发布时间】:2014-11-13 01:48:57 【问题描述】:

我有一个新手问题: 我删除了全局列表中的一个元素,但我使用了一个 return() 函数。我看到我的另一个元素仍然在他的地址(使用检查),但操作后的对象没有相同的 tracemem。 也许我不理解 tracemem 但在我删除之后,我是否移动或复制了一些东西?! 我想将一些操作与列表对象中的大数据并行化,当我完成释放内存时删除变量,所以我想确保我使用的是同一个对象。

谢谢。

参考资料:How can I remove an element from a list?

# WHEN YOU HAVE BIG DATA, after a process you want to free some memory of your
# object by remove a variable data
# E.G open a *.mat file with structured style -> list
#
# Try with big data and wait a while (your computer) to know
# object_size and mem_used()
#

#------------------------------------------------------------
#With Global Variable
x <- list('a'=123456789,'b'='highlander')
names(x)
paste(length(x),object_size(x),mem_used(),tracemem(x))
.Internal(inspect(x))

# Remove data
x['a'] <- NULL
names(x)
paste(length(x),object_size(x),mem_used(),tracemem(x))
.Internal(inspect(x))
#------------------------------------------------------------
# with function 1 - NOT WORKED
# FREE MEMORY
freeMemoryFromStructuredList1 <- function(x,select)
  paste(length(x),object_size(x),mem_used(),tracemem(x))
  x[select]<- NULL


#With Function 1
x <- list('a'=123456789,'b'='highlander')
names(x)
paste(length(x),object_size(x),mem_used(),tracemem(x))
.Internal(inspect(x))

# TRy to Remove data
freeMemoryFromStructuredList1(x,'a')
names(x)
paste(length(x),object_size(x),mem_used(),tracemem(x))
.Internal(inspect(x))

#------------------------------------------------------------
#With Function 2 (return) - WORK, Highlander at the same Address,
# but tracemem NOT

# FREE MEMORY
freeMemoryFromStructuredList2 <- function(x,select)
  paste(length(x),object_size(x),mem_used(),tracemem(x)) 
  x[select]<- NULL
  return( x )


x <- list('a'=123456789,'b'='highlander')
names(x)
paste(length(x),object_size(x),mem_used(),tracemem(x))
.Internal(inspect(x))

# Remove data
x <-freeMemoryFromStructuredList2(x,'a')
names(x)
paste(length(x),object_size(x),mem_used(),tracemem(x))
.Internal(inspect(x))

【问题讨论】:

【参考方案1】:

这与作用域和 R 函数有关。

R 函数通过值传递,而不是通过引用传递,因此当您调用函数 1 时,您正在制作列表的副本并从该副本中删除选定的元素。副本的范围是函数,因此在函数完成时将其删除,因为您不返回它。您的原始列表保持不变。

功能 2 有效,因为您返回副本,并使用副本重置原始列表,现在已删除一个元素。 tracemem 可能会随函数 2 发生变化,因为现在您的数据结构使用的内存量不同(因为它少了一个元素),因此它占用的位置与原始位置略有不同。不过,这只是一个有根据的猜测。

希望这能解决问题,我不知道你想如何并行化事情,所以我不能说。

【讨论】:

这就是我对结果的假设,但我希望有一种方法可以像在 C 中一样通过引用传递。我不再寻求进一步。谢谢DMT

以上是关于R - 如何从函数列表中删除元素的主要内容,如果未能解决你的问题,请参考以下文章

从列表列表中删除 NULL 元素

如何删除此列表中的重复元素?

R语言_list()函数用法

OpenFOAM 如何从列表中删除一些元素?

python从列表中删除元素

从列表中删除 NoneType 元素的本机 Python 函数?