2017-08-10 7 views
1

私は比較的Rに慣れていて、さらにシャイニー(文字通り最初の1日)の新人です。Rでのテキスト入力の操作Shiny

複数のフレーズをコンマで区切って入力したい場合は、female, aged, diabetes mellitus.を入力してください。データフレームには、1つの変数MH2にテキストが含まれています。私は、入力されたフレーズがすべて存在する行だけを含むデータフレームを出力したいと思います。時々、ユーザは入力のみで1フレーズ、他の回5

は、これは私のui.R

library(shiny) 
library(stringr) 

# load dataset 
load(file = "./data/all_cardiovascular_case_reports.Rdata") 

ui <- fluidPage(
    sidebarLayout(
    sidebarPanel(
     textInput(inputId = "phrases", 
       label = "Please enter all the MeSH terms that you would like to search, each separated by a comma:", 
       value = ""), 

     helpText("Example: female, aged, diabetes mellitus") 

    ), 
    mainPanel(DT::dataTableOutput("dataframe")) 
) 
) 

と、ここで私はrenderText({num_phrases}) Iを実行しようとしたとき、私のserver.Rが

library(shiny) 

server <- function(input, output) 
{ 
    # where all the code will go 
    df <- reactive({ 

     # counts how many phrases there are 
     num_phrases <- str_count(input$phrases, pattern = ", ") + 1 

     a <- numeric(num_phrases) # initialize vector to hold all phrases 

     # create vector of all entered phrases 
     for (i in 1:num_phrases) 
     { 
     a[i] <- noquote(strsplit(input$phrases, ", ")[[i]][1]) 
     } 

     # make all phrases lowercase 
     a <- tolower(a) 

     # do exact case match so that each phrase is bound by "\\b" 
     a <- paste0("\\b", a, sep = "") 
     exact <- "\\b" 
     a <- paste0(a, exact, sep = "") 

     # subset dataframe over and over again until all phrases used 
     for (i in 1:num_phrases) 
     { 
     final <- final[grepl(pattern = a, x = final$MH2, ignore.case = TRUE), ] 
     } 

     return(final) 
    }) 

    output$dataframe <- DT::renderDataTable({df()}) 
} 

ですコンマで区切られた複数のフレーズを入力しても一貫して1が得られました。それ以来、複数のフレーズを入力しようとするたびに、「エラー:添え字が範囲外です」と表示されます。しかし、カンマとスペース(カンマとスペース)で区切られた単語を入力すると、問題は消えますが、データフレームは正しくサブセット化されません。 1つのフレーズしかサブセット化できません。

お知らせください。

ありがとうございました。

答えて

1

あなたのShinyロジックは見た目が良いと思うが、データフレームをサブセット化する機能にはいくつかの小さな問題がある。特に:

a[i] <- noquote(strsplit(input$phrases, ", ")[[i]][1])

指数[[i]]1が、ここで間違った場所にあり、[[1]][i]

final <- final[grepl(pattern = a, x = final$MH2, ignore.case = TRUE), ] 

あなたは、このように複数のパターンが一致することはできませんする必要があり、意志の最初の要素だけ使用されるべきであり、それはRが与える警告でもある。


例取り組んコード

私はここinp_phrasesinput$phrasesを変更しました。このスクリプトがあなたの望むことをしているとすれば、それをあなたに簡単にコピーして、必要な変更を加えることができると思います(inp_phrasesを変更し、return(result)ステートメントを追加する)。

library(stringr) 

# some example data 
inp_phrases = "ab, cd" 
final = data.frame(index = c(1,2,3,4),MH2 = c("ab cd ef","ab ef","cd ef ab","ef gx"),stringsAsFactors = F) 

# this could become just two lines: 
a <- sapply(strsplit(inp_phrases, ", ")[[1]], function(x) tolower(noquote(x))) 
a <- paste0("\\b", a, "\\b") 

# Two options here, uncomment the one you need. 
# Top one: match any pattern in a. Bottom: match all patterns in a 
# indices = grepl(pattern = paste(a,collapse="|"), x = final$MH2, ignore.case = TRUE) 
indices = colSums(do.call(rbind,lapply(a, function(x) grepl(pattern = x, x = final$MH2, ignore.case = TRUE))))==length(a) 

result <- final[indices,] 
:パターンのいずれかが一致したので、私はそれらの両方を追加しましたし、私はあなたがすべてのパターンは、1行の中に一致させることがしたい場合も、完全には明らかではなかった、またはすべての行を返し、あなたが必要とする1のコメントを解除することができます

戻り値:秒インデックスのバージョン(すべてに一致)または

index  MH2 
1  1 ab cd ef 
2  2 ab ef 
3  3 cd ef ab 

index  MH2 
1  1 ab cd ef 
3  3 cd ef ab 

...インデックスの最初のバージョンと(任意に一致する)

希望すると便利です。

+0

ありがとうございました!はい、これはまさに私が探していたものです。すべてのフレーズに一致するコードを使用しました。再度、感謝します! – sweetmusicality

+0

問題はありません。うれしいです! – Florian

+0

おっと、それを指摘してくれてありがとう、それを固定しました! – Florian

関連する問題