%>% .$column_name 等效于 R 基管 |>

Afi*_*ari 20 r dplyr

我经常使用 dplyr 管道将一列从 tibble 转换为向量,如下所示

iris %>% .$Sepal.Length
iris %>% .$Sepal.Length %>% cut(5)
Run Code Online (Sandbox Code Playgroud)

如何使用最新的 R 内置管道符号执行相同操作 |>

iris |> .$Sepal.Length
iris |> .$Sepal.Length |>  cut(5)
Error: function '$' not supported in RHS call of a pipe
Run Code Online (Sandbox Code Playgroud)

jay*_*.sf 17

我们可以使用getElement().

iris |> getElement('Sepal.Length') |> cut(5)
Run Code Online (Sandbox Code Playgroud)

  • 或 `iris |> with(Sepal.Length)` (2认同)

Ron*_*hah 15

在基管中,没有为管道中传递的数据提供占位符。这是magrittr管道和基础 R 管道之间的一个区别。您可以使用匿名函数来访问该对象。

iris |> {\(x) x$Sepal.Length}()
Run Code Online (Sandbox Code Playgroud)

  • @jpdugo17 唯一的区别是“{}”可以包含多个表达式(用换行符或“;”分隔),并且它保留值的自动打印可见性。…当然,它使用视觉上不同的分隔符,这可以使嵌套表达式(如本例所示)更具可读性。 (3认同)

GKi*_*GKi 7

$in的直接使用|>目前已禁用。也许一个原因可能是写

iris$Sepal.Length
Run Code Online (Sandbox Code Playgroud)

并不是

library(magrittr)
iris %>% .$Sepal.Length
Run Code Online (Sandbox Code Playgroud)

如果$仍然需要调用(或 |> 中其他禁用的函数),除了创建函数之外的一个选项,类似于@jay-sf 的解决方案,是$通过函数使用::asbase::`$` 或将其放在刹车中($ )

iris |> (`$`)("Sepal.Length") |> cut(5)
iris |> base::`$`("Sepal.Length") |> cut(5)

#iris |> base::`[[`("Sepal.Length") |> cut(5) #Alternative
#iris |> base::`[`(,"Sepal.Length") |> cut(5) #Alternative
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用奇异的管道 ->.;。有些人称之为笑话,有些人则巧妙地利用了现有的语法

iris ->.; .$Sepal.Length |> cut(5)
Run Code Online (Sandbox Code Playgroud)

这会..GlobalEnv. rm(.)可以用来删除它。或者,它可以在local

local({iris ->.; .$Sepal.Length |> cut(5)})
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它会在环境中产生两个相同的对象iris.但只要它们没有被修改,它们就会指向相同的地址。

tracemem(iris)
#[1] "<0x556871bab148>"
tracemem(.)
#[1] "<0x556871bab148>"
Run Code Online (Sandbox Code Playgroud)

  • @tpetzoldt至少*g-grothendieck*将其描述为[巧妙使用现有语法](/sf/answers/4573089181/) (2认同)
  • @GKi“聪明”≠“好”。我希望没有人“实际上”建议在实践中使用它。 (2认同)

tpe*_*ldt 5

有趣的例子和很好的答案,让我添加另一个版本:我通常使用select然后unlist在这种情况下使用。这遵循“讲 R%>% ”范例,并且与运算符和的工作方式相同|>

library("dplyr")
iris %>% select(Sepal.Length) %>% unlist() %>% cut(5)

iris |> select(Sepal.Length) |> unlist() |> cut(5)
Run Code Online (Sandbox Code Playgroud)

请注意,select来自dplyrpull从 @jpdugo17 引入的效果更好。

如果我们使用通常的“base R”索引,它也很短并且在两个世界中都有效:

iris[["Sepal.Length"]] |> cut(5)

iris$Sepal.Length |> cut(5)
Run Code Online (Sandbox Code Playgroud)

感谢 @zx8754 的评论,当然也可以在没有任何管道的情况下使用基础 R

cut(iris$Sepal.Length, 5)
Run Code Online (Sandbox Code Playgroud)

...但我认为OP只是想指出管道方面的差异。我想它是要在更大的背景下应用的,iris只是一个例子。