Выстрелить другой кусок кода в зависимости от различных Shiny textInput и кнопок - PullRequest
0 голосов
/ 09 января 2019

У меня есть два textInputs, каждый со своим собственным actionButton. Я хотел бы иметь функцию (ы) eventReactive (s), которые слушают оба и запускают отдельный фрагмент кода в зависимости от того, какая кнопка была нажата. Мой интерфейс:

# load umls MRCONSO and MRREL tables

ui2<-  shinyUI(fluidPage(

    # Application title
    titlePanel("UMLS Browser"),

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
      sidebarPanel(
        radioButtons("rd",
                     label = "Query type:",
                     choices = list("Child of" = "CHD",
                                    "Parent of" = "PAR"),
                     selected = "CHD"),
        textInput("code", "Code",""),
        actionButton("do1", "Search"),
        textInput("term", "Term",""),
        actionButton("do2", "Search")

      ),
      mainPanel(
        tableOutput(list("table","table2"))
      )
    )
  )
)



#setwd('/srv/shiny_server/umlsbrowser')
#deployApp()
rm(list = ls())
library(shiny)
library(dplyr)
umls <- dbConnect(drv=RSQLite::SQLite(), 
                  dbname="umls_browser.sqlite3")

и server.r

shinyServer(function(input, output) {

  source('ui1.R') #login page
  source('ui2.R') # UMLS page



  output$page <- renderUI({ ui1 })

  # code here from Untitled2
  observeEvent(input$login,{
    output$page <- renderUI({ ui1 })
    z<-system(paste("perl", "umls_auth.pl",
                    paste0("'",input$user,"'"), paste0("'",input$password,"'")),intern=TRUE)
    if (grepl("false",z[22])) {
      #output$page <- renderUI({ ui1 })
      renderText("Incorrect credentials")
    }
    if (grepl("true",z[22])) 
    {
      output$page <- renderUI({ ui2 })
      res <- eventReactive(list(input$do1,input$do2), {
        return(as.data.frame(dbGetQuery(umls, 
                                        paste0("SELECT DISTINCT B.CUI2, C.SAB, C.CODE, C.STR FROM MRCONSO A 
                                           INNER JOIN MRREL B ON A.CUI = B.CUI1 
                                           INNER JOIN MRCONSO C ON B.CUI2 = C.CUI 
                                           WHERE B.REL = '", input$rd ,"'","AND A.STR ='", input$term ,"'","LIMIT 100",sep=""))))

        return(as.data.frame(dbGetQuery(umls, 
                                        paste0("SELECT DISTINCT B.CUI2, C.SAB, C.CODE, C.STR FROM MRCONSO A 
                                           INNER JOIN MRREL B ON A.CUI = B.CUI1 
                                           INNER JOIN MRCONSO C ON B.CUI2 = C.CUI 
                                           WHERE B.REL = '", input$rd ,"'","AND A.STR ='", input$code ,"'","LIMIT 100",sep=""))))
      })
      output$table <- renderTable({res()})
    }
  })

})

Как вы можете видеть, у меня есть два предустановленных элемента sql, но каждый из textInputs является переменной и использует отдельный actionButton для запуска. В зависимости от того, какой textInput был введен, и какой actionButton был нажат, я бы хотел запустить соответствующий SQL-оператор.

В настоящее время приведенный выше код запускает только actionButton input$do2. При нажатии input$do1 ничего не происходит. Если у кого-то есть какие-то указатели, это было бы замечательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...