我最近发现了管道操作符%>%,它可以使代码更具可读性.这是我的MWE.
library(dplyr) # for the pipe operator
library(lsr) # for the cohensD function
set.seed(4) # make it reproducible
dat <- data.frame( # create data frame
subj = c(1:6),
pre = sample(1:6, replace = TRUE),
post = sample(1:6, replace = TRUE)
)
dat %>% select(pre, post) %>% sapply(., mean) # works as expected
Run Code Online (Sandbox Code Playgroud)
但是,在这种特殊情况下,我很难使用管道操作符
dat %>% select(pre, post) %>% cohensD(.$pre, .$post) # piping returns an error
cohensD(dat$pre, dat$post) # classical way works fine
Run Code Online (Sandbox Code Playgroud)
为什么不能使用占位符.和$?组合列?是否值得使用管道运算符编写此行%>%,还是使语法复杂化?这种经典的写作方式似乎更简洁.
这可行:
dat %>% select(pre, post) %>% {cohensD(.$pre, .$post)}
Run Code Online (Sandbox Code Playgroud)
将最后一个调用包装成花括号使得它被视为表达式而不是函数调用.当你将某些东西输入表达式时,.按预期更换.我经常使用这个技巧来调用一个与管道不能很好接口的功能.
大括号内部恰好是函数调用,但实际上可以是任何表达式..
由于您将一堆数据转换为一个(一行)值,因此您需要进行总结.在dplyr管道中,您可以使用汇总函数,在汇总函数中,您不需要子集,只需调用pre和post
像这样:
dat %>% select(pre, post) %>% summarize(CD = cohensD(pre, post))
Run Code Online (Sandbox Code Playgroud)
(在这种情况下,select语句实际上并不是必需的,但是我把它留下来以显示它在管道中是如何工作的)