gpt4 book ai didi

R 管道 (%>%) 功能 - 存储和部分使用?

转载 作者:行者123 更新时间:2023-12-01 03:24:39 25 4
gpt4 key购买 nike

我喜欢管道提高可读性的想法,但由于它感觉很不灵活,我在使用它时遇到了困难。到目前为止,我只有在我的目标是通过一组函数 h(g(f(x,foo),bar),stuff) 直接管道 X 时才成功

x %>%
f(foo) %>%
g(bar) %>%
h(stuff)

如果我想存储一个中间输出以便我可以拥有 h(x,stuff,f(x,foo)),这可能吗?我试过了
x %>% 
intermediate = f(foo) %>%
g(bar)

但这失败了。赋值不起作用,因为第一个参数是名称而不是值;有相反的等价物吗?

我知道你可以用“。”多次引用 x 或它的一部分,但有没有办法最初只使用它的一部分?我想在不同的列上执行不同的功能,例如
data.frame(x[,1],apply(.[,2:3],2,fun1),apply(.[,4],2,fun2))

但我不知道如何将第一个参数限制为仅 x[,1]而不是所有 x .我不能用 %>% select(1) %>%因为那样它将永远放弃其余的。有没有办法做到这一点,或者我应该结束管道,执行这些功能,然后启动另一个管道?是将所有 x 全部放入的最简单解决方案进入数据框,然后 %>% select(1,5:9) %>% ?

最佳答案

您可以编写一个函数来完成可以包含在链中的分配。就像是

save_to <- function(x, v) {
var <- substitute(v)
eval(bquote(.(var) <- .(x)), envir=globalenv())
x
}


library(magrittr)
x<-1:10
f<-function(x) x+1
g<-function(x) x*2
h<-function(x) paste(x, collapse=", ")

x %>% f %>% g %>% save_to(z) %>% h
# [1] "4, 6, 8, 10, 12, 14, 16, 18, 20, 22"
z
# [1] 4 6 8 10 12 14 16 18 20 22

请注意,这会将值保存到全局环境中。出于这个原因,这可能不是一个好主意(在函数式语言中,具有副作用的函数通常是一种糟糕的设计实践)。最好将其分解为不同的链。
z <- x %>% f %>% g
z %>% h

关于R 管道 (%>%) 功能 - 存储和部分使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42422215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com