我正在研究R的词法循环分配,我是R的新手。我有两种方法,我的代码如下。我刚给出了行号,以便我更容易解释和理解,它们并不存在于实际中,无论如何,这种方法不是我认为的问题。
makeCacheMatrix <- function(x = matrix()) {
inv<- NULL
set<-function(y){
inv<<- NULL
x<<-y
}
get<-function() x
getinverse<-function() inv
setinverse<-function(inversed_matrix) inv<-inversed_matrix
list(setmatrix=set, getmatrix=get, getinverse = getinverse, setinverse = setinverse)
}
此功能运行良好,所有数据都按预期填充,我已经明确测试过。现在我从这个函数
创建一个对象my_matrix<-makeCacheMatrix(iris_subset)
现在是第二个功能
cacheSolve <- function(cachedMatrix, ...) {
inversed_matrix<-cachedMatrix$getinverse
if(!is.null(inversed_matrix)){
message("Getting cached inversed matrix")
return(inversed_matrix)
}
inversed_matrix<-cachedMatrix$getmatrix
cachedMatrix$setinverse(inversed_matrix)
inversed_matrix
}
现在我执行以下代码行,其中“my_matrix”是我在上面创建的函数makeCacheMatrix的对象
m<-cacheSolve(my_matrix)
这是我遇到问题的地方。当我在第3行执行空检查时,它失败了,因为它不是返回值,而是第2行中的代码返回函数“makeCacheMatrix”中的实际代码。即在第一次运行时它不是NULL而是返回文本“function()inv”,这实际上是函数makeCacheMatrix
中写的代码
以下是数据:
structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6), Sepal.Width = c(3.5,
3, 3.2, 3.1), Petal.Length = c(1.4, 1.4, 1.3, 1.5), Petal.Width = c(0.2,
0.2, 0.2, 0.2)), .Names = c("Sepal.Length", "Sepal.Width", "Petal.Length",
"Petal.Width"), row.names = c(NA, 4L), class = "data.frame")
答案 0 :(得分:0)
我按照您在评论中描述的那样对数据进行子集化:
iris <- iris[1:4,1:4]
第一步
my_matrix <- makeCacheMatrix(iris)
可生产
my_matrix
$setmatrix function (y) { inv <<- NULL x <<- y } <environment: 0x0000000013442500> $getmatrix function () x <environment: 0x0000000013442500> $getinverse function () inv <environment: 0x0000000013442500> $setinverse function (inversed_matrix) inv <- inversed_matrix <environment: 0x0000000013442500>
我不确定你在那里尝试做什么但是,鉴于第一步产生的数据结构,自然
cachedMatrix$getinverse
评估为
function() inv
<environment: 0x0000000012f859d8>
因此,if
语句将评估为TRUE
并准确返回。
因此问题在于你的第一个功能。我不能很好地理解你在第一个函数中想要完成的事情,但是一旦你修复了它,那么你的第二个函数将返回它应该的东西。
如果您需要有关第一个功能的进一步帮助,我建议您查看有关函数的R文档以尝试理解如何编写它们,然后如果遇到问题打开另一个问题并为每行提供注释以解释你想做什么以及你期望的结果。