在 R 函数中传递到 return() 时的奇怪行为?
Strange behaviour when piping to return() in R function?
在某些情况下,管道到 return()
的行为似乎与预期不符。为了演示,这里有4个案例
假设我们定义一个函数 return
是 str_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')
}
在某些情况下,管道到 return()
的行为似乎与预期不符。为了演示,这里有4个案例
假设我们定义一个函数 return
是 str_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')
}