R管道子函数中如何引用当前管道对象?
问题:基于管道中修改后的对象设置因子层级
原始可正常运行的代码
当直接使用顶层数据集(如iris)设置因子层级时,操作可以正常执行:
iris |> mutate(Species = factor(Species, levels = iris |> arrange(Petal.Width) |> pull(Species) |> unique())) |> # 后续操作 ggplot() + ...
待解决的问题
如果先对数据集进行修改(比如filter过滤),希望在factor的levels参数中引用管道中修改后的当前数据集,而非顶层的iris。尝试过.、.data以及用{}包裹代码块均无效,请问以下示例中的?iris?应替换为:
iris |> filter(Species %in% c("setosa", "versicolor")) |> mutate(Species = factor(Species, levels = ?iris? |> arrange(Petal.Width) |> pull(Species) |> unique())) |>
尝试过的错误方案
参考方案中尝试将管道对象存入临时变量,但在原生管道|>下执行报错:
iris |> filter(Species %in% c("setosa", "versicolor")) |> {. ->> tmp} |> mutate(Species = factor(Species, levels = tmp |> arrange(Petal.Width) |> pull(Species) |> unique()))
报错信息:
Error in {: function '{' not supported in RHS call of a pipe
正确解法
方法1:使用dplyr的cur_data()函数
cur_data()是dplyr提供的函数,可在mutate/summarise等操作中直接获取当前处理的数据集,完美适配原生管道|>:
iris |> filter(Species %in% c("setosa", "versicolor")) |> mutate(Species = factor(Species, levels = cur_data() |> arrange(Petal.Width) |> pull(Species) |> unique()))
方法2:切换为magrittr管道%>%
magrittr的%>%管道支持在代码块{}中用.引用当前管道对象,需要先加载magrittr包:
library(magrittr) iris %>% filter(Species %in% c("setosa", "versicolor")) %>% mutate(Species = factor(Species, levels = {.} |> arrange(Petal.Width) |> pull(Species) |> unique()))
内容的提问来源于stack exchange,提问作者dez93_2000
相关产品推荐
相关产品推荐

