为何R语言函数中return不可管道调用?func_pipe未在首个return终止?
R语言管道符中return不终止函数的原因解析
先看示例代码:
library(dplyr) func <- function() { return(1) return(2) } func_pipe <- function() { 1 %>% return() return(2) } func() # [1] 1 func_pipe() # [1] 2
核心原因:管道符的执行环境与return的作用域
return()是R中用于终止当前函数环境并返回值的特殊函数,它的作用范围仅限于自己所在的直接函数环境。- dplyr的
%>%管道符在执行时,会把右侧的表达式包裹在一个临时的子环境中运行。也就是说1 %>% return()等价于在一个临时的匿名环境里执行return(1),这个return()只会退出这个临时子环境,而不会影响外层的func_pipe()函数。 - 直接调用
return(1)时,这个return()处于func()的直接函数环境中,所以会直接终止整个func(),返回1;而管道里的return()只结束了管道的临时环境,程序会继续执行func_pipe()里的下一行代码return(2),最终返回2。
如果想在管道里实现终止外层函数的效果,不能直接用return(),而是可以把逻辑放在大括号里,让return()处于外层函数的环境中:
func_pipe_fix <- function() { 1 %>% { return(.) } return(2) } func_pipe_fix() # [1] 1
内容的提问来源于stack exchange,提问作者Julien
相关产品推荐
相关产品推荐

