Вам не нужно stringi()
для этого. Самый быстрый способ запросить данные — использовать data.table()
с ключом на country
и использовать grepl()
для подмножества данных.
Пример с использованием данных GNI2014 из пакета treemap
.
library(treemap)
library(data.table)
data(GNI2014)
gni2014table <- data.table(GNI2014)
setkey(gni2014table,"country")
searchText <- "berm"
gni2014table[grepl(searchText,gni2014table$country,ignore.case=TRUE),]
searchText <- "United"
gni2014table[grepl(searchText,gni2014table$country,ignore.case=TRUE),]
...и вывод.
> library(treemap)
> library(data.table)
> data(GNI2014)
> gni2014table <- data.table(GNI2014)
> setkey(gni2014table,"country")
> searchText <- "berm"
> gni2014table[grepl(searchText,gni2014table$country,ignore.case=TRUE),]
iso3 country continent population GNI
1: BMU Bermuda North America 67837 106140
>
> searchText <- "United"
> gni2014table[grepl(searchText,gni2014table$country,ignore.case=TRUE),]
iso3 country continent population GNI
1: ARE United Arab Emirates Asia 4798491 44600
2: GBR United Kingdom Europe 62262000 43430
3: USA United States North America 313973000 55200
>
Возврат только столбца, поле которого вы хотите заполнить в пользовательском интерфейсе, выглядит следующим образом.
searchText <- "United Arab"
gni2014table[grepl(searchText,gni2014table$country,ignore.case=TRUE),country]
ОБНОВЛЕНИЕ 20 декабря 2017 г.: добавлен код для запуска микробенчмарков, показывающий, что в первом тестовом примере lgrepl()
выполняется на 20 мс быстрее, чем stringi_detect_fixed()
, а во втором случае stringi_detect_fixed()
на 60 мс быстрее, чем lgrepl()
для 100 итераций теста. запрос.
library(treemap)
library(data.table)
library(microbenchmark)
data(GNI2014)
gni2014table <- data.table(GNI2014)
setkey(gni2014table,"country")
searchText <- "berm"
microbenchmark(gni2014table[grepl(searchText,gni2014table$country,
ignore.case=TRUE),])
searchText <- "United Arab"
microbenchmark(gni2014table[grepl(searchText,gni2014table$country,
ignore.case=TRUE),country])
library(stringi)
searchText <- "berm"
microbenchmark(gni2014table[stri_detect_fixed(searchText,
gni2014table$country,
case_insensitive=TRUE),])
searchText <- "United Arab"
microbenchmark(gni2014table[stri_detect_fixed(searchText,
gni2014table$country,case_insensitive=TRUE),])
Вам придется запустить код самостоятельно, чтобы воспроизвести тесты, потому что вывод microbenchmark()
не отображается легко на SO.
Тем не менее, обобщенная версия таймингов такова:
searchText Function Mean (in Microseconds)
------------- -------------------- -----------------------
berm grepl 526.2545
United Arab grepl 583.1789
berm stringi_detect_fixed 545.8772
United Arab stringi_detect_fixed 524.1132
person
Len Greski
schedule
20.12.2017