Thedifferencebetween bracket[]anddouble bracket[[]]foraccessingt

R 提供了两种不同的方法来访问列表或 data.frame 的元素:[]和[[]]。

R 提供了两种不同的方法来访问列表或 data.frame 的元素:[][[]]

两者之间有什么区别,什么时候应该使用一个?

394

R 语言定义是方便回答这些类型的问题:

http://cran.r-project.org/doc/manuals/R-lang.html#Indexing

R 有三个基本的索引运算符,语法由以下示例显示

    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的第

对于列表,通常使用[[来选择任何单个元素,而[返回所选元素的列表。

[[形式只允许使用整数或字符索引选择单个元素,而[允许按向量进行索引。请注意,对于列表,索引可以是向量,向量的每个元素依次应用于列表、选定组件、该组件的选定组件等。结果仍然是单个元素。

202

这两种方法之间的显著差异是它们在用于提取时返回的对象的类,以及它们是否可以接受一定范围的值,或者在赋值期间只接受单个值。

考虑以下列表中的数据提取情况:

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 中的插槽保留其原始名称。

136

双括号访问一个列表元素,而单括号则返回一个包含单个元素的列表。

lst <- list('one','two','three')
a <- lst[1]
class(a)
## returns "list"
a <- lst[[1]]
class(a)
## returns "character"
112

来自 Hadley Wickham:

From Hadley Wickham

我的(看起来很糟糕)修改显示使用 tidyverse / purrr:

enter image description here

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(173)
如何在一个元素上有多个CSS转换
上一篇
移动网站的规格是什么 (website design specs)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(46条)