这是设置。
下面是两个用于创建存储数字向量和缓存的特殊对象的函数。
第一个函数makeVector创建一个特殊的“向量”,它实际上是一个包含函数的列表
设置矢量的值 获取向量的值 设置均值的值 得到平均值
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)
}
以下函数计算使用上述函数创建的特殊“向量”的平均值。但是,它首先检查是否已经计算出平均值。如果是这样,它从缓存中获取均值并跳过计算。否则,它会计算数据的平均值,并通过setmean函数设置缓存中平均值。
cachemean <- function(x, ...) {
m <- x$getmean()
if(!is.null(m)) {
message("getting cached data")
return(m)
}
data <- x$get()
m <- mean(data, ...)
x$setmean(m)
m
}
好的,我正在考虑这个2功能2天。我试着理解它是如何工作的,因为我需要为不同的目的编写类似的功能。 经过所有这些思考后,我无法理解一件事 - 为什么我们需要在makeVector中设置set()函数以及它做了什么?
下面是我设法理解的内容以及我如何理解逻辑的描述(取自我对Coursera的评论):
makeVector
没有set()
功能吗?
set()
永远不会在cachemean
中调用。并且makeVector
中的任何功能都不会调用set()
。我理解的是真正发生的事情:
cachemean
调用getmean()
函数并将其分配给变量m
。 m
这里是cachemean
范围getmean()
返回m
已经来自makeVector
范围的内容makeVector
! m
范围NULL
在执行时为cachemean
m
检查NULL
是否为NULL
。在第一次调用时,它是if
,因此我们会跳过data
条件get()
并将其分配给get()
函数的调用。 x
会返回makeVector
的值,而makeVector
实际上是data
的形式参数。换句话说,它返回一个我们最初传递给cahchemean
函数的向量作为参数。在此之后,我们m
是我们的数字向量data
范围makeVector
重新分配给setmean()
的mean()。那就是我们找到我们作为参数传递给m
的数字向量的意思。makeVector
函数并将我们的数字向量的平均值 - setmean()
- 作为参数传递给它。如果您查看m
,您会看到makeVector
所做的只是将传递给它的参数分配给cachemean
但m
范围内的内容! cachemean
返回cachemean
。当我们再次在同一个向量上调用getmean()
时,有趣的事情就会发生。
m
的第一行是此处的关键行。我们将cachemean
分配到 getmean()
范围中的makeVector
。但是getmean()
在这种情况下做了什么?如果您查看m
,makeVector
只会从m
范围中返回m
BUT的值。并且该范围中message
的值是我们对数字向量的平均值。m
是否为NULL,显然不是。因此,我们打印cachemean
并返回set()
,这只是我们在第一次调用cachemean
时找到的意思。现在出现了让我困惑的问题。为什么我们需要定义set()
函数?
我们不会从makeVector
调用它。
此外,如果您从cachemean
删除set()
,它仍然可以正常工作,y
仍然有效,并返回数字向量的平均缓存值。
此外 - 此外,如果我仔细观察x
函数,这个函数真的没有意义。它将形式参数get()
分配给父环境变量NULL
。但为什么我们需要这样做呢?如果要获得初始数字向量,那么我们按m
进行。
然后它将set()
分配给{{1}},这也没有意义。在我们完成同样的事情之前只是一条线。
所以可以请有人解释我:
我理解逻辑是否正确?
{{1}}函数正在做什么以及为什么我们需要它?
提前多多感谢!
P.S。我是R的新手而且我很蠢,但我想明白,我在这里缺少什么。
编辑:非常抱歉长时间阅读。但是这个网站上的每个人都在问我已经做过/尝试了什么,所以我试着描述一下: - )