gpt4 book ai didi

R:存储在内存中的函数的形式在哪里?

转载 作者:行者123 更新时间:2023-12-01 00:19:15 25 4
gpt4 key购买 nike

当一个函数已经定义但还没有被调用时,没有默认值的形式是否存在?如果存在,它们是存在于执行环境中,还是存在于函数定义所在的环境中,或者其他地方?

如果一个函数已经被定义但还没有被调用,并且一个formal已经被分配了一个默认值,那个值是否存在?如果有,它存在于什么环境中?如果默认表达式的计算结果是一个常量,形式是否已分配给该值,如果提供了值,则在调用函数时将被覆盖?如果不是,那么(固定的)默认值位于定义时刻和调用函数之间的时间是什么环境?

在调用函数并将实际值或默认值分配给形式后,传递到主体中,并在必要时确定范围和/或评估后,形式是否继续存在?如果是,那么它们存在于什么环境中?

最佳答案

一旦通过调用将函数的实例加载到内存中,函数的形式就作为函数环境中的对象存在。在高级 R 中,Hadley Wickham 将此环境称为 execution environment .可以通过 pryr::address() 访问对象的内存位置。 .

作为示例,我将使用我之前编写的代码的修改版本来说明 makeVector() 中的内存位置。约翰霍普金斯大学第二次编程作业中的函数 R Programming类(class)在 coursera.org .

makeVector <- function(x = 200) {
library(pryr)
message(paste("Address of x argument is:",address(x)))
message(paste("Number of references to x is:",refs(x)))
m <- NULL
set <- function(y) {
x <<- y
message(paste("set() address of x is:",address(x)))
message(paste("Number of references to x is:",refs(x)))
m <<- NULL
}
get <- function() x
setmean <- function(mean) m <<- mean
getmean <- function() m
list(set = set, get = get,
setmean = setmean,
getmean = getmean)
}

如上编码, makeVector()是一个 S3 对象,这意味着我们可以通过 getter 和 setter 访问其环境中的对象,也称为 mutator methods .

我们可以加载 makeVector() 的实例对象放入内存并查询 x的地址和值使用以下代码。
makeVector()$get()

...结果:
> makeVector()$get()
Address of x argument is: 0x1103df4e0
Number of references to x is: 0
[1] 200
>

从输出中可以看出, x确实有一个内存位置,但没有其他对象包含对它的引用。另外, x被设置为长度为 1 的向量的默认值,值为 200。

我提供了 makeVector() 中对象的详细演练我对 Caching the Mean of a Vector in R 的回答中的环境.

关于形式在内存中存在多长时间的问题,只要为存储函数的调用实例而创建的环境在内存中,它们就存在。由于垃圾收集器对没有外部引用的对象进行操作,如果函数实例未保存到对象中,则只要函数调用将结果返回给父环境,它就有资格进行垃圾收集。

关于R:存储在内存中的函数的形式在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50085942/

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