【问题标题】:Caching the mean of a Vector in R (list)在R(列表)中缓存向量的平均值
【发布时间】:2017-01-29 08:09:20
【问题描述】:

这是对Caching the mean of a Vector in R 的跟进,特别是关于最后一行代码

list(set = set, get = get, setmean = setmean, getmean = getmean)

我不明白list 在做什么。链接问题给出的答案:

list() 返回包含刚刚定义的所有函数的“特殊向量”

对我来说没有多大意义。我认为makeVector 应该返回一个具有适当setget 方法的对象,但现在确定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)
 }

【问题讨论】:

  • 你知道R中的list是什么吗?它是 R 中的“基本”类型,基本上是一个向量,其元素是任意 R 对象(考虑函数也是 R 中的对象)。列表的元素可以通过tag=value 范式命名。 list(set=set) 表示:创建一个列表,其第一个元素名为set,并具有set 对象的值(之前已定义)。
  • @nicola:我刚从R 开始,所以显然我不清楚这一点。所以左侧的set 是可以用来访问右侧的set 函数的名称。因此,如果代码为setValue &lt;- function(y),则list 参数将为set = setValue。所以初始化数据的“方法”仍然是set,它会调用函数setValue。那是对的吗?也就是setValue不能直接调用?
  • 你可能应该读完 An Introduction to R。闭包和函数工厂对于你目前的理解水平来说似乎太高级了。
  • @Roland:嗯,是的,我知道这对我来说很先进——这就是我苦苦挣扎的原因。您对我上面的评论有任何见解吗?如果我的理解是正确的,不同的名字(当这个例子在课程中给出时)不会更清楚吗?
  • 如果您了解范围界定,这里没有什么令人困惑的地方。如果您不了解范围界定,则根本无法理解此示例。

标签: r caching mean


【解决方案1】:
> z<- makeVector()
> z

上述语句将返回“makeVector”函数中所有四个函数的列表,即$set、$get、$setmean、$getmean

$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

希望对你有帮助

【讨论】:

    【解决方案2】:

    我在我的文章Demystifying makeVector() 的第二个约翰霍普金斯大学R 编程作业中提供了这两个函数的广泛演练。

    也就是说,这是list() 语句在makeVector() 中如何工作的答案。

    第 3 步:通过返回 list() 创建一个新对象

    这是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按名称访问函数,而不是使用提取运算符的[[形式,如myVector[[2]](),获取内容向量。

    这里需要注意的是cachemean() 函数需要makeVector() 类型的输入参数。如果将一个正则向量传递给函数,如

     aResult <- cachemean(1:15)
    

    函数调用将失败并出现错误,说明cachemean() 无法访问输入参数上的$getmean(),因为$ 不适用于原子向量。这是准确的,因为原始向量不是列表,也不包含$getmean() 函数,如下图所示。

    > aVector <- 1:10
    > cachemean(aVector)
    Error in x$getmean : $ operator is invalid for atomic vectors
    

    【讨论】:

      猜你喜欢
      • 2014-09-14
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 2013-07-22
      相关资源
      最近更新 更多