gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:05:56 26 4
gpt4 key购买 nike

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

这是一个典型的例子:

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 会在函数完成执行时被删除,但我是否应该担心提前删除它?

最佳答案

来自 Hadley Wickham's advanced R :

In some languages, you have to explicitly delete unused objects for their memory to be returned. R uses an alternative approach: garbage collection (or GC for short). GC automatically releases memory when an object is no longer used. It does this by tracking how many names point to each object, and when there are no names pointing to an object, it deletes that object.

在您描述垃圾收集将释放内存的情况下。

如果您的函数的输出是另一个函数,在这种情况下,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 创建于 2019-07-08 (v0.3.0)

在这种情况下,如果你想控制封闭环境中哪些变量可用,或者确保你不会弄乱你的内存,你可能想删除不需要的对象,方法是使用 rm/remove 就像你所做的那样,或者像我更喜欢的那样,包裹在 on.exit 语句中。

我可能会使用 rm 的另一种情况是,如果我想从父环境访问变量,而不会有它们在函数内部被覆盖的风险,但在这种情况下,通常可以使用 eval.parent 并且更清晰

y <- 2
z <- 3
test0 <- function(x, var){
y <- 1
x + eval(substitute(var))
}

# opps, the value of y is the one defined in the body
test0(0, y)
#> [1] 1
test0(0, z)
#> [1] 3

# but it will work using eval.parent :
test1 <- function(x, var){
y <- 1
x + eval.parent(substitute(var))
}
test1(0, y)
#> [1] 2
test1(0, z)
#> [1] 3

# in some cases (better avoided), it can be easier/quick and dirty to do something like :
test2 <- function(x, var){
y <- 1
# whatever code using y
rm(y)
x + eval(substitute(var))
}
test2(0, y)
#> [1] 2
test2(0, z)
#> [1] 3

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

关于r - 什么时候值得在 R 函数中使用 `remove`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56936637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com