Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
缓存R中向量的平均值_R_Caching_Mean - Fatal编程技术网

缓存R中向量的平均值

缓存R中向量的平均值,r,caching,mean,R,Caching,Mean,我正在学习R,在实践作业中遇到了一些代码 makeVector <- function(x = numeric()) { m <- NULL set <- function(y) { x <<- y m <<- NULL } get <- function() x setmean <- func

我正在学习R,在实践作业中遇到了一些代码

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

makeVector
m我认为理解此示例的一个好方法是尝试以下内容:

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
}
首先检查使用函数make_Vector时是否有四种不同的设置

> mvec <- makeVector()
> x <- 1:4
> mvec$set(x)
> mvec$get()
> [1] 1 2 3 4
> mvec$getmean()
> NULL
> mvec$setmean(3.4)
> mvec$getmean()
> 3.4

您必须通过示例中使用的原始mvec列表

此答案摘自我在2016年作为约翰霍普金斯大学R编程课程的社区导师撰写的一篇文章:

makeVector()和cachemean()的总体设计 cachemean.R文件包含两个函数,
makeVector()
cachemean()
。文件中的第一个函数,
makeVector()
创建一个存储向量及其平均值的R对象。第二个函数,
cachemean()
需要一个由
makeVector()
返回的参数,以便从存储在
makeVector()
对象环境中的缓存值中检索平均值

list(set = set, get = get,
     setmean = setmean,
     getmean = getmean)
makeVector()中发生了什么?
makeVector()
中需要理解的关键概念是,它构建一组函数,并将列表中的函数返回给父环境。就是

    myVector <- makeVector(1:15)
请注意,
x
被初始化为函数参数,因此在函数中不需要进一步初始化
m
设置为NULL,将其初始化为makeVector()环境中的对象,供函数中的后续代码使用


此外,函数声明的形式部分将默认值
x
定义为空数值向量。使用默认值初始化向量非常重要,因为如果没有默认值,
data,我无法理解为什么在第一部分正常工作时会出现这种情况:cachemean中的错误(m):对象“m”未找到后续问题:。
makeVector(x = numeric()) {
  m <- NULL
  ...
}
 Error in x$get() : argument "x" is missing, with no default
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)
    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
 aResult <- cachemean(1:15)
> aVector <- 1:10
> cachemean(aVector)
Error in x$getmean : $ operator is invalid for atomic vectors
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
  aVector <- makeVector(1:10)
  aVector$get()               # retrieve the value of x
  aVector$getmean()           # retrieve the value of m, which should be NULL
  aVector$set(30:50)          # reset value with a new vector
  cachemean(aVector)          # notice mean calculated is mean of 30:50, not 1:10
  aVector$getmean()           # retrieve it directly, now that it has been cached
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)
}
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
}
 cachemean(makeVector(1:100))
 cachemean(makeVector(1:100))
  Error in x$get() : argument "x" is missing, with no default