这是Caching the mean of a Vector in R的后续内容,具体是关于最后一行代码
list(set = set, get = get, setmean = setmean, getmean = getmean)
我不明白list
正在做什么。链接问题给出了答案:
list()返回包含刚刚定义的所有函数的“特殊向量”
对我来说没什么意义。我认为makeVector
应该返回一个具有适当的set
和get
方法的对象,但现在确定这个list()
是如何做到的。左侧的set
是什么,右侧的set
是什么?
makeVector <- function(x = numeric()) {
m <- NULL
set <- function(y) {
x <<- y
m <<- NULL
}
get <- function() x
setmean <- function(mean) m <<- mean
getmean <- function() m
list(set = set, get = get,
setmean = setmean,
getmean = getmean)
}
答案 0 :(得分:1)
> z<- makeVector()
> z
$set
function (y)
{
x <<- y
m <<- NULL
}
<environment: 0x0000000008935dc8>
$get
function ()
x
<environment: 0x0000000008935dc8>
$setmean
function (mean)
m <<- mean
<environment: 0x0000000008935dc8>
$getmean
function ()
m
<environment: 0x0000000008935dc8>
> z$set(c(1:20))
> z$get()
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
> z$setmean(mean(z$get()))
> z$getmean()
[1] 10.5
答案 1 :(得分:0)
我在文章Demystifying makeVector()中的第二个约翰霍普金斯 R编程作业中对这两个函数进行了广泛的演练。
那就是说,这里是list()
陈述在makeVector()
中如何运作的答案。
这是makeVector()
函数操作中“魔法”的另一部分。代码的最后一部分将每个函数分配为list()
中的元素,并将其返回到父环境。
list(set = set, get = get,
setmean = setmean,
getmean = getmean)
当函数结束时,它返回一个完全形成的makeVector()
类型的对象,供下游R代码使用。关于此代码的另一个重要细节是列表中的每个元素都是named。也就是说,列表中的每个元素都使用elementName = value
语法创建,如下所示:
list(set = set, # gives the name 'set' to the set() function defined above
get = get, # gives the name 'get' to the get() function defined above
setmean = setmean, # gives the name 'setmean' to the setmean() function defined above
getmean = getmean) # gives the name 'getmean' to the getmean() function defined above
命名列表元素允许我们使用$
form of the extract operator按名称访问函数,而不是使用提取运算符的[[
形式,如{{1}获取向量的内容。
重要的是要注意myVector[[2]]()
函数需要类型为cachemean()
的输入参数。如果将常规向量传递给函数,如
makeVector()
函数调用将失败并显示错误,说明 aResult <- cachemean(1:15)
无法访问输入参数cachemean()
,因为$getmean()
不适用于原子向量。这是准确的,因为原始向量不是列表,也不包含$
函数,如下所示。
$getmean()