代码之家  ›  专栏  ›  技术社区  ›  Andrew John Lowe

向量化的if/else构造,以避免在条件为FALSE时调用昂贵的函数?

  •  0
  • Andrew John Lowe  · 技术社区  · 8 年前

    出身背景

    缓慢的 )从属于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

    将计算条件为真时的返回值和条件为假时的返回值,并使用条件将结果向量拼接在一起。

    因此,我昂贵而缓慢的函数运行的次数比实际需要的要多得多。

    我想要什么

    否则 什么时候 当条件为真时,仅当为真时才计算结果。

    到目前为止我都试过了

    我试着编写自己的矢量化实现 否则 / ,但没有成功。我也尝试过非标准评估,但我知道的还不够多,无法做到这一点。我猜如果我能得到一个 否则 退票 我随后在适当的时间(类似于冻干函数调用)计算的表达式这可能是解决方案的一部分。但到目前为止还没有什么乐趣。

    有没有什么我错过了去做我想做的事情?或者有人能提供一些关于实现的提示吗?谢谢

    0 回复  |  直到 8 年前
    推荐文章