在R(列表)

时间:2017-01-29 08:09:20

标签: r caching mean

这是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)
 }

2 个答案:

答案 0 :(得分: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

我希望有帮助

答案 1 :(得分:0)

我在文章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按名称访问函数,而不是使用提取运算符的[[形式,如{{1}获取向量的内容。

重要的是要注意myVector[[2]]()函数需要类型为cachemean()的输入参数。如果将常规向量传递给函数,如

makeVector()

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

$getmean()