2017-12-20 8 views
1

大きなデータフレームを検索するために光沢のあるアプリを作ったので、stringiを使用すると思いました。しかし、私はアプリを実行すると、空の検索パターンがサポートされていないという警告が表示されます。このサンプルアプリケーションでは、私の大きなデータフレームアプリケーションではすべてが遅くなり、アプリケーションを停止できる唯一の方法はRセッションを終了させるという唯一の方法で、この警告を無視できます(スパムを防ぎますが)。光沢のあるstringiを使ってデータフレームを検索すると警告が表示されます

## app.R ## 
require(shiny) 
require(stringi) 
require(dplyr) 
require(DT) 

ui <- fluidPage(textInput("searchall", label = "Search"), 
      dataTableOutput("tableSearch")) 

server <- function(input, output, session) { 
    data(GNI2014) 
    output$tableSearch <- DT::renderDataTable(datatable(
    GNI2014 %>% filter(
     if (!is.null(input$searchall)) 
     stri_detect_fixed(str = country , pattern = input$searchall) 
    ), 
    options = list(sDom = '<"top">lrt<"bottom">ip') 
)) 
} 

shinyApp(ui, server) 

私はこのアプリを実行すると、私は次の警告が殺到します:stri_detect_fixed(STR =国、パターン=入力の$検索searchall) で

警告:空の検索パターンは

をサポートされていません。

この警告とそれに伴う減速を回避するにはどうすればよいでしょうか。

答えて

1

これにはstringi()は必要ありません。データをクエリする最速の方法は、data.table()countryのキーを使用し、grepl()を使用してデータをサブセット化することです。

treemapパッケージのGNI2014データを使用する例。

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 
> 

UIのフィールドに値を設定したい列だけを返します。

searchText <- "United Arab" 
gni2014table[grepl(searchText,gni2014table$country,ignore.case=TRUE),country] 

UPDATE 2017年12月20日:20ミリ秒の高速stringi_detect_fixed()より実行し、第2の場合にlgrepl()最初のテストケースでは、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 
+0

感謝。私はsrtingiがそれぞれのフィールドにbigi-shのチャンクを持つ大きなデータフレームを持っていることを考えれば、srtingiが好ましいオプションだと思っています。https://stackoverflow.com/q/24257850/3967488 – magasr

+1

@magasrあなたが投稿したURL矛盾したタイミングでは、grepl()がstringi_detect_fixed()よりも高速で、もう一方の答えが逆であることが示されています。あなたの実際の問題のマイクロベンチマークを含むように私の投稿を更新すると、ソリューションをコード化したときに、grepl()で検索する方が速くなりますが、stringi_detect_fixed()では検索が高速になります。つまり、各コールの100回の反復の結果は、お互いに60ミリ秒以内であるか、または個々のコールごとに実質的に区別できません。 –

+1

編集: "... 100反復の結果はお互いに60マイクロ秒以内です"。 –

関連する問題