如何跟踪 R 中其他环境的值

How do I keep track of a value on other environment in R

我正在尝试为在线课程分配作业,但一直试图在缓存中保留一个值。基本上,将有两个函数:一个是闭包函数,并托管一个变量来跟踪缓存中的值。另一个负责管理矩阵。问题是程序似乎没有为每个矩阵存储 m 的值,并且总是认为缓存中已经有值。我如何跟踪缓存的值?

makeCacheMatrix <- function(x = matrix()) {
    m<-NULL
    set<-function(y){
        x<<-y
        m<<-NULL
    }
    get<-function()x
    inverse<-function(x) m<<-solve(x)
    cache<-function() m
    list(set=set(x),get=get(),inverse=inverse(x),cache=cache())
}


## Write a short comment describing this function
cacheSolve <- function(x, ...) {
        ## Return a matrix that is the inverse of 'x'
        n<-makeCacheMatrix(x)$cache
        if (!is.null(n)){
            print("Loading from cache")
            return(n)
        }
        else{
            makeCacheMatrix(x)$set
            data<-makeCacheMatrix(x)$get
            makeCacheMatrix(data)$inverse

            makeCacheMatrix(data)$cache
    }}

不完全清楚您在这里尝试的是什么。我的猜测是你想要一个缓存,这样如果你需要 运行 一个对象上的资源密集型函数,那么你只需要 运行 它一次,但此后就可以访问存储的计算的结果。不管计算是否已经运行,你想要相同的接口来访问结果。

你可以这样做:

store_matrix_for_cache <- function(x = matrix()) {
  m <<- NULL
  function()
  {
    x <<- x
    list(get = x, cache = m, solve = function() m <<- solve(x))
  }
}

get_cached_result <- function(cache, ...) 
{
  if (is.null(cache()$cache))
  {
    cat("Solving before returning from cache\n")
    cache()$solve()
  } 
  else 
  {
    cat("Loading from cache\n")
  }

  return(cache()$cache)
}

所以让我们用一些样本数据来测试它:

set.seed(69)
my_mat   <- matrix(sample(9), nrow = 3)

my_mat
#>      [,1] [,2] [,3]
#> [1,]    2    5    9
#> [2,]    4    1    6
#> [3,]    7    3    8

我们首先将矩阵写入缓存。请注意我们的“昂贵”solve 函数尚未被调用,因此这在计算上很便宜:

my_cache <- store_matrix_for_cache(my_mat)

当我们来提取结果的时候,那么第一次,我们会触发solve计算:

get_cached_result(my_cache)
#> Solving before returning from cache
#>           [,1]       [,2]       [,3]
#> [1,]  2.000000  1.0000000 -2.0000000
#> [2,] -1.727273 -0.4545455  1.5454545
#> [3,]  1.090909  0.1818182 -0.8181818

但是,我们第二次(及以后)访问缓存时,不会触发 solve 函数,而是 return 存储的结果。

get_cached_result(my_cache)
#> Loading from cache
#>           [,1]       [,2]       [,3]
#> [1,]  2.000000  1.0000000 -2.0000000
#> [2,] -1.727273 -0.4545455  1.5454545
#> [3,]  1.090909  0.1818182 -0.8181818

另请注意,我们的访问器函数可以通过删除 cat 消息来缩短,现在我们很高兴它按预期工作:

get_cached_result <- function(cache, ...) 
{
  if (is.null(cache()$cache)) cache()$solve()
  cache()$cache
}

reprex package (v0.3.0)

于 2020-07-25 创建