【问题标题】:in R what is this bracket `[` with the back ticks [duplicate]在R中,这个括号“[”是什么,带有反引号[重复]
【发布时间】:2019-06-10 13:19:32
【问题描述】:
library(tidyverse)
mtcars %>% .[1:2, ]

当我%>% 管道数据集转发时,我通常使用. 句点来完成任务。上面提供了一个示例。我注意到许多其他人也使用句号 .

最近,我在 stackoverflow 上得到了一个答案,其功能等同于 `[`(以及一些其他交换页),如下所示。

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

这是什么`[`?如果您可以在 cmets 中推荐一种在 Google、Bing 等上搜索此类内容的方法。当您在 Google 中搜索 `[` 时,搜索结果并不多。

【问题讨论】:

  • `[` 是实际功能。 [] 是您使用它的方式。为什么不在 R 控制台中输入?`[`?或者只是`[` 来查看它的源代码。我猜这是this的密密麻麻的欺骗
  • 某些函数中通常有特殊字符需要使用反引号,通常是内部函数,例如索引([$[[)和带空格的函数在名称中(不常见)。在 R 控制台上,'['"[" 都返回字符串,因此反引号是一种表示 “不是字符串,是 特殊 的方式。
  • 这些括号是特定对象的访问器方法,可以像普通函数一样使用,通过使用反引号。在这种情况下,函数的第一个参数是对象本身,应该在 dplyr 链中省略。您可能会发现以下有用:adv-r.had.co.nz/Functions.html#all-calls
  • JasonHunter,DSGym 的链接很好地解释了其中的大部分内容。为了配合我的第一条评论,该函数的 <- 组件使它“特别”。尽管您可以单独使用levels(使用该示例),但<- 要求您告诉R 不要单独解析<-,因此`levels<-`(带有反引号)是访问该特殊因素的方式-效用函数。

标签: r


【解决方案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 会找到多次出现的名称。在这种情况下,它会告诉您它在哪里找到每个并让第 i 个使用 getAnywhere(...)[i] 其中 ... 是您要查找的名称。

【讨论】:

  • 最好使用反引号`[`,而不是单引号'[' 或双引号"[",这是否正确?我记得听到了一个很好的理由。
  • 这只是风格问题。我个人倾向于使用反引号。
【解决方案2】:

对代码行号的引用对 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 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2020-12-03
    • 2013-05-20
    相关资源
    最近更新 更多