R中`if`语句的等价功能,可以与管道运算符一起使用

问题描述 投票:0回答:1

是否有一个函数可以执行以下操作?

library(dplyr)

cond = T
if (cond) { 
  print('Hello')
}
# [1] "Hello"

# How can I achieve the same as above with a pipe ? 
print('Hello') %>% function_if(cond)

purrr::when
ifelse
功能在这里似乎不起作用。

r if-statement dplyr purrr
1个回答
1
投票

诚然,我看不出这有什么用处……但是

function_if <- function(data, expr) if (isTRUE(expr)) force(data)
cond <- TRUE
print('Hello') %>%
  function_if(cond)
# [1] "Hello"
print('Hello') %>%
  function_if(cond) %>%
  class()
# [1] "Hello"                 # <-- action of 'print'
# [1] "character"             # <-- output from 'class', to show that
print('Hello') %>%            # <-- this never happens here
  function_if(FALSE) %>%
  class()
# [1] "NULL"                  # <-- output from 'class', no 'print' output

坦白说,我不知道我会用这个。

它的工作方式:

data
(可以是任何对象)在这里被延迟定义。这里的执行顺序是:
%>%
function_if
,只有当
isTRUE(expr)
时,才强制评估
data
。如果为 true,则评估并返回
data
;如果不是 true,则
function_if
不会强制数据,因此它的惰性存在永远不会被实例化,并且
NULL
会隐式返回。

也许 this 函数的更好名称是

stoppipe_if_not
,这意味着如果
data.frame
ition 不精确
cond,管道中的所有数据流(无论是 
TRUE
 还是其他任何东西)都不会被传递。 
.

© www.soinside.com 2019 - 2024. All rights reserved.