今回は思い付きの小ネタです。Rのstringrパッケージは一貫性が売りですが、やや冗長なところがあります。たとえば我々が行(ログの場合にはイベント)を絞り込むとき、大文字・小文字を区別せずにマッチさせたいことが多々あります。これをstringrで表現すると、次の通りです。
log_http |> filter(str_detect(uri, fixed("union", ignore_case = TRUE)))
フィルターが1行だけならともかく、現場ではフィルターを重ねることが少なくないので、str_detect()が重たく感じます。もっと気軽にKQLのcontains的に使いたくて、containsに相当する演算子を作ってみました。
"%~%" <- function(string, pattern) { stringi::stri_detect_fixed(string, pattern, case_insensitive = TRUE) }
こうすると、先ほどのフィルターは
log_http |> filter(uri %~% "union")
と書けます。含まない場合には、
log_http |> filter(!uri %~% "union")
でOK。スマホの画面にも収まる短さです。個人的に、めちゃくちゃ便利になりました。