Выберите строку в данных после поиска с помощью selectizeinput - PullRequest
0 голосов
/ 13 июля 2020

Я хочу выбрать данные после ввода нескольких ключевых слов. Я хочу повторить этот процесс выбора данных после ввода некоторых ключевых слов. Например, я хочу выбрать автомобили Mazda и Maserati. Я не хочу складывать ключевые слова Mazda и ключевые слова Maserati вместе, чтобы получить данные. Я хочу ввести ключевое слово Mazda и выбрать данные, а затем удалить Mazda и ввести ключевое слово Maserati в поле поиска над данными. Проблема с моим кодом заключается в том, что если я удалю Mazda и введу Maserati, выбранная строка будет удалена.

Вот мой код:

library(shiny)
library(tidyverse)
library(readxl)
library(DT)
library(shinydashboard)
mtcars_df <- rownames_to_column(mtcars)
names(mtcars_df)[1] <- "Name"
mtcars_df$Keywords <- ""
for (i in 1:nrow(mtcars_df)){
  temp1 <- strsplit(as.character(tolower(str_squish(mtcars_df$Name[i])))," ")[[1]]
  for (j in 1:length(temp1)){
    mtcars_df$Keywords[i] <- paste0(mtcars_df[i, "Keywords"], trimws(gsub(",$","",temp1[j])), ", ")
  }
}

keywordschoice <- sort(trimws(unique(tolower(gsub(",$","",unlist(strsplit(mtcars_df$Keywords, ",")))))))
## create the interactive 
ui <- fluidRow(column(9, offset = 1,
                    selectizeInput(inputId = "keywords", label = "Select keyword(s)", choices = keywordschoice, selected = "Mazda", multiple = T),
                    br(),
                    DT::dataTableOutput("table"),
                    br(),
                    br(),
                    DT::dataTableOutput("table2"),
                    br(),
                    actionButton("gobutton","Configure"),
                    br(),
                    br(),
                    htmlOutput("updated.df"),
                    br()
    ))

server <- shinyServer (
  function (input, output, session) {
    
    dataoftable <- reactive({
      database <- mtcars_df
      keywords <- c(input$keywords)
      if (is.null(keywords)){
        all_df_display <- mtcars_df 
      } else {
        all_df <- data.frame()
        for (i in 1:length(keywords)){
          df <- mtcars_df[grepl(keywords[i], mtcars_df$Keywords, perl = TRUE), ]
          all_df <- rbind(all_df, df)
        }
        all_df <- distinct(all_df)
        all_df$num <- str_count(all_df$Keywords, paste(keywords, collapse = "|"))
        all_df_display <- all_df %>% arrange(desc(num))
      }
      all_df_display        
    })
    
    output$table <- DT::renderDataTable(dataoftable()   , server = TRUE, options = list(searching = FALSE))
    
    dataoftable2 <- reactive({
      s <- input$table_rows_selected
      df_input <- dataoftable()
      if(length(dataoftable())){
        df_input <- df_input[s, ]
      }
      df_input
    })
    
    output$table2 <- DT::renderDataTable(dataoftable2(), server = FALSE, options = list(searching = FALSE), editable = list(target = 'cell', disable = list(columns = c(1,2))))  ###
    
  }
)

shinyApp(ui = ui, server = server)

Есть ли другой способ, которым я могу воспользоваться? может это сделать? Пожалуйста, дайте мне знать, если что-то непонятно.

Спасибо.

1 Ответ

0 голосов
/ 17 июля 2020

Внесите изменения в фрейм данных, который вы используете в выходных данных, как

output$table <- DT::renderDataTable(mtcars_df   , server = TRUE, options = list(searching = FALSE))
output$table2 <- DT::renderDataTable(dataoftable(), server = FALSE, options = list(searching = FALSE), editable = list(target = 'cell', disable = list(columns = c(1,2))))

Тогда он отлично работает. Кроме того, я не вижу, чтобы table_rows_selected определялся где-либо в ui. Итак, я не уверен, как можно было определить dataoftable2. Значит, он был пуст.

...