如何跟踪 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 创建
我正在尝试为在线课程分配作业,但一直试图在缓存中保留一个值。基本上,将有两个函数:一个是闭包函数,并托管一个变量来跟踪缓存中的值。另一个负责管理矩阵。问题是程序似乎没有为每个矩阵存储 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 创建