makeCacheMatrix <- function(x = matrix()) {
invm <- NULL
set <- function(y) {
x <<- y
invm <<- NULL
}
get <- function() x
setinverse <- function(solve) invm <<- solve()
getinverse <- function() invm
list(set = set, get = get,
setinverse = setinverse,
getinverse = getinverse)
}
cacheSolve <- function(x, ...) {
invm <- x$getinverse()
if(!is.null(invm)) {
message("getting cached matrix")
return(invm)
}
unit <- x$get()
invm <- solve(unit, ...)
x$setinverse(invm)
invm
}
在测试运行中,我创建了一个4/4矩阵,然后将其与第一个函数一起存储。第二个功能应该检查矩阵是否已缓存,如果是,则打印一条消息并使用存储的矩阵。我想知道什么可能导致下面显示的错误。我不知道为什么数据不传递给Solve函数。
> test <- matrix(rnorm(16, 3), 4, 4)
> test
[,1] [,2] [,3] [,4]
[1,] 2.654912 4.085775 3.1288214 5.059539
[2,] 3.252612 3.403775 0.9990708 1.623138
[3,] 1.705998 3.586488 3.3337772 1.849144
[4,] 2.040830 4.815228 4.1713251 2.294179
> test2 <- makeCacheMatrix(test)
> cacheSolve(test2)
Error in solve.default() : argument "a" is missing, with no default
答案 0 :(得分:1)
调用x$setinverse(invm)
时,您正在传递matrix
对象。但是在函数setinverse
中,您正在使用solve()
将其一个参数作为函数调用。不幸的是,尽管此时的solve
是指最初作为invm
传递的 object ,但R足够聪明地知道solve()
是要使用< em> function ,因此是指base::solve
,而不是矩阵。如果运行base::solve()
,将得到相同的错误。因此,您的问题是您的setinverse
是错误的。
如果您改为分配setinverse <- function(z) invm <<- solve(z)
,它似乎可以正常运行。 编辑:实际上,我认为您只是将其用作“设置”功能,因此实际上应该是setinverse <- function(solve) invm <<- solve
(或您的电话function(z) invm <<- z
)。>
注意:我并没有考虑整个过程,以了解这是否真的是您想要做的事情。
功能:
makeCacheMatrix <- function(x = matrix()) {
invm <- NULL
set <- function(y) {
x <<- y
invm <<- NULL
}
get <- function() x
setinverse <- function(z) invm <<- z
getinverse <- function() invm
list(set = set, get = get,
setinverse = setinverse,
getinverse = getinverse)
}
# cacheSolve as previously defined
可重复运行(建议您下次使用set.seed
)
set.seed(42)
test <- matrix(rnorm(16, 3), 4, 4)
test
# [,1] [,2] [,3] [,4]
# [1,] 4.37095845 3.40426832 5.01842371 1.61113930
# [2,] 2.43530183 2.89387548 2.93728590 2.72121123
# [3,] 3.36312841 4.51152200 4.30486965 2.86667866
# [4,] 3.63286260 2.90534096 5.28664539 3.63595040
test2 <- makeCacheMatrix(test)
cacheSolve(test2)
# [,1] [,2] [,3] [,4]
# [1,] 0.819557500 1.961377325 -1.416577665 -0.714220507
# [2,] -0.162978899 -0.332156840 0.713223804 -0.241513973
# [3,] -0.343049934 -1.761166112 0.897525201 0.762466368
# [4,] -0.189839546 0.866424154 -0.459528758 0.073008724
答案 1 :(得分:0)
有效!非常感谢! 我仍然没有得到的是为什么mean()函数不需要此规范,仍然可以引用一个对象。最初,代码是这样的:
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
}