使用双括号不清楚

时间:2017-10-05 21:10:16

标签: r square-bracket

我是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))

2 个答案:

答案 0 :(得分:0)

语法[[]]用于python中的list。您的helper.call是一个列表(resultcounter),因此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 )