在 R 函数中传递到 return() 时的奇怪行为?

Strange behaviour when piping to return() in R function?

在某些情况下,管道到 return() 的行为似乎与预期不符。为了演示,这里有4个案例

假设我们定义一个函数 returnstr_replace_all

的结果
library(stringr)
library(dplyr)

string <- letters[1:9] %>% paste0(collapse="")

funct <- function(string) {
  
  return(string %>% str_replace_all(., "ef", "HHH"))
  
}

funct(string)
# [1] "abcdHHHghi"

现在假设我们通过管道传输到 return - 函数按预期工作

funct <- function(string) {
  
  string %>% str_replace_all(., "ef", "HHH") %>% return(.)
  
}

funct(string)
# [1] "abcdHHHghi"

但是如果我们在return之后添加一些任意命令,我们不会得到预期的输出([1] "abcdHHHghi")

funct <- function(string) {
  
  string %>% str_replace_all(., "ef", "HHH") %>% return(.)
  
  print('hi')
  
}

funct(string)
# [1] "hi"

请注意,如果我们不通过管道传输到 return,我们会 看到预期的行为

funct <- function(string) {
  
  return(string %>% str_replace_all(., "ef", "HHH"))
  
  print('hi')
}

funct(string)
# [1] "abcdHHHghi"

问题

是什么导致了这种行为?我们如何在管道传输时将 return 变为 return(如预期的那样)?

期望的输出

funct <- function(string) {

  string %>% str_replace_all(., "ef", "HHH") %>% return(.)

  print('hi')

}

funct(string)

应该return# [1] "abcdHHHghi"

备注

基于 时类似的奇怪行为,我尝试了

funct <- function(string) {
  
  string %>% str_replace_all(., "ef", "HHH") %>% return(., envir = .GlobalEnv)
  
  print('hi')
  
}

funct(string)

但没有帮助:

Error in return(., envir = .GlobalEnv) : 
multi-argument returns are not permitted 

return 在链的 RHS 上时面临一些评估问题。看到这个 github issue thread

如果你必须使用 return 最安全的方法是使用

funct <- function(string) {
   return(string %>% stringr::str_replace_all("ef", "HHH"))
   print('hi')
}

funct(string)
#[1] "abcdHHHghi"

我们可以使用OP提到的方式

funct <- function(string) {

  return(string %>% string::str_replace_all(., "ef", "HHH"))

  print('hi')
 }