什么时候值得在R函数中使用`remove`?

时间:2019-07-08 14:02:30

标签: r performance function

在决定是否remove一个不会在函数中再次使用的变量时,我应该考虑哪些因素?

这是个点头例子:

DivideByLower <- function (a, b) {
  if (a > b) {
    tmp <- a
    a <- b
    b <- tmp
    remove(tmp) # When should I include this line?
  }

  # Return:
  a / b
}

我了解到tmp将在函数完成执行后被删除,但我是否应该担心更早地删除它?

1 个答案:

答案 0 :(得分:4)

来自Hadley Wickham's advanced R

  

在某些语言中,您必须明确删除以下内容的未使用对象:   他们的记忆要归还。 R使用另一种方法:垃圾   集合(或简称GC)。当出现以下情况时,GC会自动释放内存:   对象不再使用。它通过跟踪多少个名称来做到这一点   指向每个对象,当没有名称指向   对象,它将删除该对象。

如果您要描述的是垃圾回收,则会释放内存。

如果函数的输出是另一个函数,则Hadley将这些函数分别命名为函数工厂制造函数,它们是在主体中创建的变量功能工厂的功能将在制造功能的封闭环境中可用,并且不会释放内存。

更多信息,仍在Hadley的书中,可以在关于function factories的一章中找到。

function_factory <- function(x){
  force(x)
  y <- "bar"
  fun <- function(z){
    sprintf("x, y, and z are all accessible and their values are '%s', '%s', and '%s'",
            x, y, z)
  }
  fun
}

manufactured_function <- function_factory("foo")
manufactured_function("baz")
#> [1] "x, y, and z are all accessible and their values are 'foo', 'bar', and 'baz'"

reprex package(v0.3.0)于2019-07-08创建

在这种情况下,如果要控制封闭环境中可用的变量,或者确保不使内存混乱,则可以使用rm / { {1}}或我倾向于将其包装在remove语句中。

我可能使用rm的另一种情况是,如果我想从父级环境访问变量而没有在函数内部覆盖它们的风险,但是在这种情况下,通常可以使用on.exit并且更干净。

eval.parent

reprex package(v0.3.0)于2019-07-08创建