resolve.default()中的错误:缺少参数“ a”,没有默认值

时间:2020-03-28 19:03:21

标签: r

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 

2 个答案:

答案 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
}