是否可以动态地将变量名称分配给 magrittr 管道中的向量?
Is it possible to dynamically assign variable names to a vector in a magrittr pipeline?
R
中的某些函数,例如 quantile
,丢失了我想保留的矢量名称。假设我设置了以下管道:
> dist <- c(0, 1, 2, 3)
> qnts <- c(lower = 0.25, upper = 0.75)
> qnts %>% quantile(dist, .)
# 25%. 75%
# 0.75 2.25
> qnts %>% quantile(dist, ., names = FALSE)
# [1] 0.75 2.25
在这两种情况下,分位数都会丢失 qnts
向量中的名称。
毫不奇怪,管道内的分配不起作用:
> qnts %>% quantile(dist, .) %>% names(.) <- c("upper", "lower")
# Error in qnts %>% quantile(dist, ., names = FALSE) %>% naes(.) <- c("upper", :
# could not find function "%>%<-"
我也不能使用 assign
---因为 names(.)
不是变量---或重命名---在这个特定的例子中,我可以使用 rename(., c("25%" = "lower", "75%" = "upper"))
,但在我的用例中,分位数动态变化。
一定有什么方法可以智能地恢复 qnts
的名字,但我想不通。
用大括号包裹赋值并使用 T 型管似乎可行:
qnts %>% quantile(dist, .) %T>% {names(.) <- c("upper", "lower")}
对于 magrittr
,set_names
会更合适(Alias
对应 `names<-`
)
library(magrittr)
qnts %>%
quantile(dist, .) %>%
set_names(c("upper", "lower"))
# upper lower
# 0.75 2.25
或者可以将最后一步从 base R
改为 setNames
而不是 set_names
另一种选择是使用 names<-
,但它不太容易理解
qnts %>%
quantile(dist, .) %>%
`names<-`(c("upper", "lower"))
R
中的某些函数,例如 quantile
,丢失了我想保留的矢量名称。假设我设置了以下管道:
> dist <- c(0, 1, 2, 3)
> qnts <- c(lower = 0.25, upper = 0.75)
> qnts %>% quantile(dist, .)
# 25%. 75%
# 0.75 2.25
> qnts %>% quantile(dist, ., names = FALSE)
# [1] 0.75 2.25
在这两种情况下,分位数都会丢失 qnts
向量中的名称。
毫不奇怪,管道内的分配不起作用:
> qnts %>% quantile(dist, .) %>% names(.) <- c("upper", "lower")
# Error in qnts %>% quantile(dist, ., names = FALSE) %>% naes(.) <- c("upper", :
# could not find function "%>%<-"
我也不能使用 assign
---因为 names(.)
不是变量---或重命名---在这个特定的例子中,我可以使用 rename(., c("25%" = "lower", "75%" = "upper"))
,但在我的用例中,分位数动态变化。
一定有什么方法可以智能地恢复 qnts
的名字,但我想不通。
用大括号包裹赋值并使用 T 型管似乎可行:
qnts %>% quantile(dist, .) %T>% {names(.) <- c("upper", "lower")}
对于 magrittr
,set_names
会更合适(Alias
对应 `names<-`
)
library(magrittr)
qnts %>%
quantile(dist, .) %>%
set_names(c("upper", "lower"))
# upper lower
# 0.75 2.25
或者可以将最后一步从 base R
改为 setNames
而不是 set_names
另一种选择是使用 names<-
,但它不太容易理解
qnts %>%
quantile(dist, .) %>%
`names<-`(c("upper", "lower"))