出身背景
缓慢的
)从属于dplyr管道的另一个函数中调用的函数:
dat %>%
mutate_at(.vars = vars(dplyr::intersect(starts_with("locale"), ends_with("last_name"))),
.funs = funs(native_last_name_alpha(., Type))) %>%
{.} -> dat
Type
(字符串)与“男性”或“女性”匹配。如果有比赛,
native_last_name_alpha
将运行计算昂贵且
做其他事情的函数。如果没有对手,
本地姓氏字母
会回来的
NA
. 目前,因为这是矢量化的,所以我使用
if_else
和
case_when
要确定应该发生什么,例如:
native_last_name_alpha <- function(locale, type) {
case_when(
type == "male" ~ stringi::stri_trans_toupper(
fake_single_alpha(locale = locale,
request = "last_name_male",
provider = "faker.providers.person")
),
type == "female" ~ stringi::stri_trans_toupper(
fake_single_alpha(locale = locale,
request = "last_name_female",
provider = "faker.providers.person")
),
TRUE ~ NA_character_
)
}
TRUE
FALSE
,这使得我的脚本运行速度非常慢。
深入挖掘if_else、if else和case_when
否则
和
ifelse
)不要像传统的if…else语句那样工作;
全部的
v <- c(-100, -10, 10, 100)
ifelse(v > 0, log10(v), log10(-v))
警告信息:
2:在ifelse中(v>0,log10(v),log10(-v)):产生了NAN
将计算条件为真时的返回值和条件为假时的返回值,并使用条件将结果向量拼接在一起。
因此,我昂贵而缓慢的函数运行的次数比实际需要的要多得多。
我想要什么
否则
什么时候
当条件为真时,仅当为真时才计算结果。
到目前为止我都试过了
我试着编写自己的矢量化实现
否则
/
,但没有成功。我也尝试过非标准评估,但我知道的还不够多,无法做到这一点。我猜如果我能得到一个
否则
退票
我随后在适当的时间(类似于冻干函数调用)计算的表达式这可能是解决方案的一部分。但到目前为止还没有什么乐趣。
有没有什么我错过了去做我想做的事情?或者有人能提供一些关于实现的提示吗?谢谢