Когда вы вызываете x$setinverse(invm)
, вы передаете объект matrix
. Но в функции setinverse
вы вызываете один ее аргумент как функцию, используя solve()
. К сожалению, в то время как solve
в этот момент относится к объекту , переданному изначально как invm
, R достаточно умен, чтобы знать, что solve()
предназначен для использования функции и поэтому имеет в виду 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