Почему lapply не пересылает дополнительные аргументы?

У меня есть большой набор данных твитов, где каждая строка представляет собой один уникальный твит, и у меня есть список ключевых слов, которые я хочу извлечь из этих твитов, если одно или несколько из них присутствуют в переменной text. Этот список ключевых слов был скомпилирован в регулярное выражение (сохраненное в переменной search_key), включая некоторые обходные пути и другие условия.

Извлечение строк прекрасно работает, если используется следующий код:

data$keyword <- stri_extract_all(str = data$text, regex = search_key)

Но чтобы оптимизировать/распараллелить код, хотелось бы использовать функции из семейства apply. Но при выполнении одной из следующих строк я всегда получаю сообщение об ошибке, потому что аргумент regex не передается функции stri_extract_all:

data$keyword <- lapply(data$text, FUN = stri_extract_all(), regex = search_key)
data$keyword <- lapply(data$text, FUN = stri_extract_all(), regex = get(search_key))
data$keyword <- lapply(data$text, FUN = stri_extract_all(), ... = "regex=search_key")

Это поведение происходит независимо от search_key и содержимого переменной text, поэтому для тестирования можно использовать любой столбец текста и любое работающее регулярное выражение. Следующие данные являются упрощенной версией моих данных и также могут быть использованы:

data <- structure(list(status_id = c(1112765520644894720, 1112938379296104448, 
1112587129622876160, 1113006196259196928, 1112840488208531456
), text = c("@LaraFukuro more frilly stuff but i actually found a matching carrot bag which also screamed \"LARA\" inside me xD", 
"@EuroMasochismo @VaeVictis @AlbertoBagnai @Comunardo La selezione fatta a dodici anni favorisce chi è seguito. È come selezionare a 4 anni chi deve giocare a pallone proibendolo a tutti gli altri ...", 
"@SignorErnesto @Cr1st14nM3s14n0 @ggargiulo3 @micheleboldrin Sbagliato io.", 
"@BrownResearchGT On Aconcagua, the permit requires climbers above basecamp to collect their waste and carry it back down where it's taken away by helicopter. They actually weigh the bag! And still, most small rocks had human feces underneath. It's a problem!\r\nHopefully @DenaliNPS will follow suit. ", 
"@Jenn198523 Once you silence a person &amp; cover them with a huge trash bag, beating &amp; killing are not far behind."
)), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"
))

search_key <- "(?<=(^|\\s|\\D))([:alnum:]*|@[:alnum:]*|#[:alnum:]*)bag([:alnum:]*)(?=(\\D|\\s|$))"


 
Какую ошибку я совершаю и как ее решить?
Любые советы по оптимизации таких задач, конечно, тоже приветствуются.


person LTribe    schedule 02.09.2020    source источник
comment
Удалите () как lapply(data$text, FUN = stri_extract_all, regex = search_key).   -  person GKi    schedule 02.09.2020


Ответы (1)


stri_extract_all уже векторизован на str. Вам не нужно заключать его в lapply, и вы значительно замедлите свой код, если сделаете это.

data$keyword <- stri_extract_all(data$text, regex = search_key)
person bcarlsen    schedule 02.09.2020
comment
Большое спасибо за разъяснение! Я только что заметил, что так написано в документации. Есть ли у вас какие-либо способы распараллелить векторизованные функции? Или есть другие способы их оптимизации? - person LTribe; 03.09.2020