为了账号安全,请及时绑定邮箱和手机立即绑定

用于访问列表或数据框元素的方括号[]和双括号[[]]之间的区别

用于访问列表或数据框元素的方括号[]和双括号[[]]之间的区别

慕桂英3389331 2019-05-29 17:06:05
用于访问列表或数据框元素的方括号[]和双括号[[]]之间的区别R提供了两种不同的方法来访问列表或data.frame- []和[[]]运算符的元素。两者有什么区别?在什么情况下我应该使用一个而不是另一个?
查看完整描述

3 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

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

考虑以下列表中的数据提取案例:

foo <- list( str='R', vec=c(1,2,3), bool=TRUE )

假设我们想从foo中提取bool存储的值并在if()语句中使用它。这将说明它们用于数据提取的返回值[][[]]何时之间的差异。该[]方法返回类列表的对象(如果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'中的“裸”对象,该对象将具有适当的类:

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


查看完整回答
反对 回复 2019-05-29
?
DIEA

TA贡献1820条经验 获得超2个赞

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


lst <- list('one','two','three')


a <- lst[1]

class(a)

## returns "list"


a <- lst[[1]]

class(a)

## returns "character"


查看完整回答
反对 回复 2019-05-29
  • 3 回答
  • 0 关注
  • 1860 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信