library(tidyverse)
mtcars %>% .[1:2, ]
当我%>%
个管道数据集被转发时,我通常使用.
期来完成任务。上面提供了一个示例。我注意到许多其他人都使用句点.
做同样的事情。
最近,在堆栈溢出上为我提供了答案,功能上等效的`[`
(以及其他一些交换)如下所示。
mtcars %>% `[`(1:2, )
`[`
是什么?而且,如果您可以在评论中提出建议,请推荐一种在Google,Bing等网站上搜索此类内容的方法。当您在Google中搜索`[`
时,不会出现太多问题。
答案 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(`[`)
但是在这种情况下,它只是一个原始的,所以我们得到:
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
方法。