我经常使用 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)
Ron*_*hah 15
在基管中,没有为管道中传递的数据提供占位符。这是magrittr管道和基础 R 管道之间的一个区别。您可以使用匿名函数来访问该对象。
iris |> {\(x) x$Sepal.Length}()
Run Code Online (Sandbox Code Playgroud)
$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)
有趣的例子和很好的答案,让我添加另一个版本:我通常使用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来自dplyr并pull从 @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只是一个例子。