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

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

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

两者有什么区别?在什么情况下我应该使用一个而不是另一个?


慕桂英3389331
浏览 1866回答 3
3回答

白衣染霜花

两种方法之间的显着差异是它们在用于提取时返回的对象类,以及它们是否可以接受一系列值,或者在赋值期间只接受一个值。考虑以下列表中的数据提取案例:foo&nbsp;<-&nbsp;list(&nbsp;str='R',&nbsp;vec=c(1,2,3),&nbsp;bool=TRUE&nbsp;)假设我们想从foo中提取bool存储的值并在if()语句中使用它。这将说明它们用于数据提取的返回值[]与[[]]何时之间的差异。该[]方法返回类列表的对象(如果foo是data.frame,则[[]]返回data.frame),而方法返回其类由其值的类型确定的对象。因此,使用该[]方法会导致以下结果:if(&nbsp;foo[&nbsp;'bool'&nbsp;]&nbsp;){&nbsp;print("Hi!")&nbsp;}Error&nbsp;in&nbsp;if&nbsp;(foo["bool"])&nbsp;{&nbsp;:&nbsp;argument&nbsp;is&nbsp;not&nbsp;interpretable&nbsp;as&nbsp;logical class(&nbsp;foo[&nbsp;'bool'&nbsp;]&nbsp;)[1]&nbsp;"list"这是因为该[]方法返回了一个列表,而一个列表不是有效的对象,而是直接传递给一个if()语句。在这种情况下,我们需要使用,[[]]因为它将返回存储在'bool'中的“裸”对象,该对象将具有适当的类:if(&nbsp;foo[[&nbsp;'bool'&nbsp;]]&nbsp;){&nbsp;print("Hi!")&nbsp;}[1]&nbsp;"Hi!"class(&nbsp;foo[[&nbsp;'bool'&nbsp;]]&nbsp;)[1]&nbsp;"logical"第二个区别在于,[]操作员可以用于访问数据帧中列表或列中的一系列时隙,而[[]]操作员仅限于访问单个插槽或列。考虑使用第二个列表进行值赋值的情况bar():bar&nbsp;<-&nbsp;list(&nbsp;mat=matrix(0,nrow=2,ncol=2),&nbsp;rand=rnorm(1)&nbsp;)假设我们想要用bar中包含的数据覆盖foo的最后两个插槽。如果我们尝试使用[[]]运算符,则会发生以下情况:foo[[&nbsp;2:3&nbsp;]]&nbsp;<-&nbsp;bar Error&nbsp;in&nbsp;foo[[2:3]]&nbsp;<-&nbsp;bar&nbsp;:&nbsp;more&nbsp;elements&nbsp;supplied&nbsp;than&nbsp;there&nbsp;are&nbsp;to&nbsp;replace这是因为[[]]仅限于访问单个元素。我们需要使用[]:foo[&nbsp;2:3&nbsp;]&nbsp;<-&nbsp;bar print(&nbsp;foo&nbsp;)$str[1]&nbsp;"R"$vec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[,1]&nbsp;[,2][1,]&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0[2,]&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0$bool[1]&nbsp;-0.6291121请注意,虽然赋值成功,但foo中的插槽保留了原始名称。

DIEA

双括号访问列表元素,而单个括号返回一个包含单个元素的列表。lst <- list('one','two','three')a <- lst[1]class(a)## returns "list"a <- lst[[1]]class(a)## returns "character"
打开App,查看更多内容
随时随地看视频慕课网APP