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
cl( foo[ 'bool' ] )
[1] "list"

这是因为[]方法返回了一个列表,并且列表不是直接传递到if()语句中的有效对象。在这种情况下,我们需要使用[[]],因为它将返回存储在 'bool' 中的“bare”对象,该对象将具有适当的类:

if( foo[[ 'bool' ]] ){ print("Hi!") }
[1] "Hi!"
cl( 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]
cl(a)
## returns "list"
a <- lst[[1]]
cl(a)
## returns "character"
112

来自 Hadley Wickham:

From Hadley Wickham

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

enter image description here

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

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

相关推荐

  • Ca talent:linkedin人才洞察 api

    关于Ca talent的问题,在insight api中经常遇到,我正在为我们的组织进行 linkedin 人才洞察。目前我们从 linkedin Talentpool 手动下载报告。我们正在根据不同的搜索条件手动下载 500 多个报告。有什么方法可以自动下载吗?我正在寻找用于下载相同报告的 API,以便我们可以以编程方式下载报告。任何输入将不胜感激。…

    2022-12-14 09:55:49
    0 16 67
  • sc的替代方法是什么:SitecoreMVC中的EditFrame

    我正在处理的项目是一个使用 MVC 的新 Sitecore 8 网站构建,并且需要页面编辑器支持。简单的字段正在使用FieldRenderer.render()方法解决,但也有一些 droplink 和 multilist 字段需要在页面编辑器中可用。在 webforms 中,您可以使用sc:editframe控件,但是在使用 Sitecore MVC 时如何获得相同的功能?…

    2022-11-11 15:19:08
    0 10 84
  • 我需要生成格式保留的信用卡代理(令牌)(generate credit card number)

    对于电子商务应用程序,我需要使用信用卡并使用真实卡通过支付网关,但我需要存储并返回到交易发起者,这是格式保留的代理。…

    2022-12-28 07:25:46
    0 15 70
  • css预编译器: center;}

    CSS预编译器是一种用于构建CSS的工具,它可以将CSS代码转换为更易于管理和维护的格式。它们可以使CSS代码更加灵活,更易于重用,并且可以帮助开发人员更轻松地组织和管理CSS代码。…

    2023-01-05 06:29:43
    0 37 54
  • linux切换到超级用户:```shecho 'Hello World' > hello_world.txt```

    Linux切换到超级用户的方法有两种:使用su命令:…

    2023-02-20 00:24:31
    0 48 51
  • xcode代码格式化快捷键:使用Command + I快速格式化Xcode代码

    格式化的方法格式化的方法Xcode代码格式化快捷键:Option+Command+F…

    2023-02-06 04:35:36
    0 36 78
  • plc和java哪个难学比较学习难度的对比

    PLC和Java哪个难学这个问题的答案取决于你的背景和目标。PLC是一种工业控制系统,它使用专用的编程语言来控制机器和设备。它的编程语言比较复杂,而且不同的厂家会有不同的语言,所以学习PLC的难度会比较大。而Java是一种通用的编程语言,它的语法比较简单,而且可以跨平台使用,所以学习Java的难度会比PLC要小一些。…

    2023-03-22 09:22:12
    0 39 65
  • linux的共享文件夹在哪个目录:Linux共享文件夹在/etc/samba目录下

    Linux的共享文件夹在/var/lib/samba/目录下,查看该目录下的文件可以使用以下代码:ls /var/lib/samba/…

    2023-01-21 15:31:10
    0 11 70

发表评论

登录 后才能评论

评论列表(72条)