在R中,带括号的括号[[`]是什么

时间:2019-06-10 13:19:32

标签: r

library(tidyverse)
mtcars %>% .[1:2, ]

当我%>%个管道数据集被转发时,我通常使用.期来完成任务。上面提供了一个示例。我注意到许多其他人都使用句点.做同样的事情。

最近,在堆栈溢出上为我提供了答案,功能上等效的`[`(以及其他一些交换)如下所示。

mtcars %>% `[`(1:2, )

`[`是什么?而且,如果您可以在评论中提出建议,请推荐一种在Google,Bing等网站上搜索此类内容的方法。当您在Google中搜索`[`时,不会出现太多问题。

2 个答案:

答案 0 :(得分:1)

R中的一个函数是使用fun(arg1,arg2,...)调用的,但是某些函数可以使用不同的语法来调用。当我们编写BOD[1, 2]时,我们实际上是在调用参数BOD,1和2上的[函数,并且可以将其替换为普通函数调用。因为[使用了对象名称通常不允许的特殊字符,所以我们必须用反引号将其括起来,以告知R将其视为名称。也可以将其指定为常量字符串。因此,这些都是一样的:

BOD[1, 2]
`[`(BOD, 1, 2)  # same
"["(BOD, 1, 2)  # same
'['(BOD, 1, 2)  # same

示例

这是其他示例:

1 + 2
`+`(1, 2)  # same

3 %in% 2:4
`%in%`(3, 2:4)  # same

if (2 > 3) 4 else 5
`if`(2 > 3, 4, 5)  # same

getAnywhere

我们可以使用getAnywhere找到函数的代码,如下所示:

getAnywhere(`[`)

但是在这种情况下,它只是一个原始的,所以我们得到:

A single object matching ‘[’ was found
It was found in the following places
  package:base
  namespace:base
with value

.Primitive("[")

实际上,在这种情况下,当第一个参数是数据帧时,[会执行[.data.frame且该事件具有R源,因此我们可以这样做来查看其源:

getAnywhere(`[.data.frame`)

在某些情况下,getAnywhere查找到多次出现的名称。在这种情况下,它将告诉您在哪里找到它们并使用getAnywhere(...)[i]来获得第i个,其中...是您要查找的名称。

答案 1 :(得分:0)

对代码行号的引用对R 3.6.0有效。
答案在来源中。在文件src/library/base/R/dataframe.R的第605行中,您可以看到类[的对象的提取方法"data.frame"的定义。

`[.data.frame` <-
    function(x, i, j, drop = if(missing(i)) TRUE else length(cols) == 1)
{
    # function body
}

因此泛型为'[',而magrittr管道调用的是上述方法。

library(magrittr)

subdf1 <- mtcars %>% `[`(1:2, )
subdf2 <- `[`(mtcars, 1:2, )
subdf3 <- `[.data.frame`(mtcars, 1:2, )

identical(subdf1, subdf2)
#[1] TRUE
identical(subdf2, subdf3)
#[1] TRUE

在第一个示例中,使用了管道。
在第二个示例中,调用了通用提取函数,并且S3调度机制调用了适当的方法。
在第三个示例中,直接调用data.frame方法。