Ошибка в solve.default (): отсутствует аргумент "a", по умолчанию нет - PullRequest
1 голос
/ 28 марта 2020
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, которая затем была сохранена с первой функцией. Вторая функция должна проверять, кэширована ли матрица, если это так, распечатать сообщение и использовать сохраненную матрицу. Я хотел бы знать, что может вызвать ошибку, показанную ниже. Я понятия не имею, почему данные не передаются в функцию решения.

> 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 

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Когда вы вызываете 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
0 голосов
/ 28 марта 2020

Работает! Спасибо огромное! Однако я до сих пор не понимаю, почему функция 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...