我是Tilman Davies的R. Reading Book Of R的新手。提供了一个示例,说明如何使用外部定义的辅助函数,它偶然使用双方括号[[]]。请解释一下helper.call [[1]]和helper.call [[2]]正在做什么,并在这里使用双括号。
multiples_helper_ext <- function(x=foo,matrix.flags,mat=diag(2){
indexes <- which(matrix.flags)
counter <- 0
result <- list()
for(i in indexes){
temp <- x[[i]]
if(ncol(temp)==nrow(mat)){
counter <- counter+1
result[[counter]] <- temp%*%mat
}
}
return(list(result,counter))
}
multiples4 <- function(x,mat=diag(2),str1="no valid matrices",str2=str1){
matrix.flags <- sapply(x,FUN=is.matrix)
if(!any(matrix.flags)){
return(str1)
}
helper.call <- multiples_helper_ext(x,matrix.flags,mat=diag(2)
result <- helper.call[[1]] #I dont understand this use of double bracket
counter <- helper.call[[2]] #and here either
if(counter==0){
return(str2)
} else {
return(result)
}
}
foo <- list(matrix(1:4,2,2),"not a matrix","definitely not a matrix",matrix(1:8,2,4),matrix(1:8,4,2))
答案 0 :(得分:0)
语法[[]]
用于python中的list
。您的helper.call
是一个列表(result
和counter
),因此helper.cal[[1]]
会返回此列表的第一个元素(result
)。
看看这里:Understanding list indexing and bracket conventions in R
答案 1 :(得分:0)
在R中有两种基本类型的对象:列表和向量。列表项可以是其他对象,向量项通常是数字,字符串等。
要访问列表中的项目,请使用双括号[[]]。这会在列表的那个位置返回对象。 所以
x <- 1:10
x现在是整数向量
L <- list( x, x, "hello" )
L是一个列表,其第一项是向量x,第二项是向量x,第三项是字符串“hello”。
L[[2]]
这会返回一个矢量,1:10,存储在L的第二位。
L[2]
这有点令人困惑,但这会返回一个列表,其唯一项目是1:10,即它只包含L [[2]]。
在R中,当您想要返回多个值时,通常使用列表执行此操作。所以,你可能会以
结束你的运作f <- function() {
return( list( result1="hello", result2=1:10) )
}
x = f()
现在您可以使用
访问这两个结果print( x[["result1"]] )
print( x[["result2"]] )
您还可以使用“$”访问列表中的项目,因此您可以编写
print( x$result1 )
print( x$result2 )