R 提供了两种不同的方法来访问列表或 data.frame 的元素:[]
和[[]]
。
两者之间有什么区别,什么时候应该使用一个?
R 语言定义是方便回答这些类型的问题:
http://cran.r-project.org/doc/manuals/R-lang.html#IndexingR 有三个基本的索引运算符,语法由以下示例显示
x[i]
x[i,j]
x[[i]]
x[[i,j]]
x$a
x$"a"
x[i] x[i, j] x[[i]] x[[i, j]] x$a x$"a"
对于向量和矩阵,很少使用[[
形式,尽管它们与[
形式在语义上有一些细微的差异(例如,它删除了任何名称或 dimnames 属性,并且部分匹配用于字符索引)。当使用单个索引索引结构时,x[[i]]
或x[i]
将返回i
的第
对于列表,通常使用[[
来选择任何单个元素,而[
返回所选元素的列表。
[[
形式只允许使用整数或字符索引选择单个元素,而[
允许按向量进行索引。请注意,对于列表,索引可以是向量,向量的每个元素依次应用于列表、选定组件、该组件的选定组件等。结果仍然是单个元素。
这两种方法之间的显著差异是它们在用于提取时返回的对象的类,以及它们是否可以接受一定范围的值,或者在赋值期间只接受单个值。
考虑以下列表中的数据提取情况:
foo <- list( str='R', vec=c(1,2,3), bool=TRUE )
假设我们想从 foo 中提取 bool 存储的值,并在if()
语句中使用它。这将说明[]
和[[]]
的返回值在用于数据提取时的差异。[]
方法返回 list 类的对象(如果 foo 是 data.frame,则返回 data.frame)
因此,使用[]
方产生以下结果:
if( foo[ 'bool' ] ){ print("Hi!") }
Error in if (foo["bool"]) { : argument is not interpretable as logical
class( foo[ 'bool' ] )
[1] "list"
这是因为[]
方法返回了一个列表,并且列表不是直接传递到if()
语句中的有效对象。在这种情况下,我们需要使用[[]]
,因为它将返回存储在 'bool' 中的“bare”对象,该对象将具有适当的类:
if( foo[[ 'bool' ]] ){ print("Hi!") }
[1] "Hi!"
class( foo[[ 'bool' ]] )
[1] "logical"
第二个区别是[]
运算符可用于访问数据帧中列表或列的范围,而[[]]
运算符仅限于访问单个插槽或列。考虑使用第二个列表bar()
进行值分配的情况:
bar <- list( mat=matrix(0,nrow=2,ncol=2), rand=rnorm(1) )
假设我们想用 bar 中包含的数据覆盖 foo 的最后两个插槽。如果我们尝试使用[[]]
运算符,则会发生以下情况:
foo[[ 2:3 ]] <- bar
Error in foo[[2:3]] <- bar :
more elements supplied than there are to replace
这是因为[[]]
仅限于访问单个元素,我们需要使用[]
:
foo[ 2:3 ] <- bar
print( foo )
$str
[1] "R"
$vec
[,1] [,2]
[1,] 0 0
[2,] 0 0
$bool
[1] -0.6291121
请注意,虽然分配成功,但 foo 中的插槽保留其原始名称。
双括号访问一个列表元素,而单括号则返回一个包含单个元素的列表。
lst <- list('one','two','three')
a <- lst[1]
class(a)
## returns "list"
a <- lst[[1]]
class(a)
## returns "character"
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(41条)