R:小函数在没有从任何地方调用时会做什么?

时间:2016-01-15 12:49:30

标签: r

这是设置。

下面是两个用于创建存储数字向量和缓存的特殊对象的函数。

第一个函数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()。我理解的是真正发生的事情:

  1. cachemean调用getmean()函数并将其分配给变量mm这里是cachemean范围
  2. 中的局部变量
  3. getmean()返回m已经来自makeVector范围的内容makeVectorm范围NULL在执行时为cachemean
  4. m检查NULL是否为NULL。在第一次调用时,它是if,因此我们会跳过data条件
  5. 现在我们创建一个局部变量get()并将其分配给get()函数的调用。 x会返回makeVector的值,而makeVector实际上是data的形式参数。换句话说,它返回一个我们最初传递给cahchemean函数的向量作为参数。在此之后,我们m是我们的数字向量
  6. 下一步很简单。我们将data范围makeVector重新分配给setmean()的mean()。那就是我们找到我们作为参数传递给m的数字向量的意思。
  7. 现在出现了允许我们缓存结果的步骤!我们调用makeVector函数并将我们的数字向量的平均值 - setmean() - 作为参数传递给它。如果您查看m,您会看到makeVector所做的只是将传递给它的参数分配给cachemean m范围内的内容!
  8. 最后cachemean返回cachemean
  9. 当我们再次在同一个向量上调用getmean()时,有趣的事情就会发生。

    1. m的第一行是此处的关键行。我们将cachemean分配到 getmean()范围中的makeVector。但是getmean()在这种情况下做了什么?如果您查看mmakeVector只会从m范围中返回m BUT的值。并且该范围中message的值是我们对数字向量的平均值。
    2. 之后很简单。我们检查m是否为NULL,显然不是。因此,我们打印cachemean并返回set(),这只是我们在第一次调用cachemean时找到的意思。
    3. 现在出现了让我困惑的问题。为什么我们需要定义set()函数?

      我们不会从makeVector调用它。

      此外,如果您从cachemean删除set(),它仍然可以正常工作,y仍然有效,并返回数字向量的平均缓存值。

      此外 - 此外,如果我仔细观察x函数,这个函数真的没有意义。它将形式参数get()分配给父环境变量NULL。但为什么我们需要这样做呢?如果要获得初始数字向量,那么我们按m进行。

      然后它将set()分配给{{1}},这也没有意义。在我们完成同样的事情之前只是一条线。

      所以可以请有人解释我:

      1. 我理解逻辑是否正确?

      2. {{1}}函数正在做什么以及为什么我们需要它?

      3. 提前多多感谢!

        P.S。我是R的新手而且我很蠢,但我想明白,我在这里缺少什么。

        编辑:非常抱歉长时间阅读。但是这个网站上的每个人都在问我已经做过/尝试了什么,所以我试着描述一下: - )

0 个答案:

没有答案