Как иметь одну наблюдаемую функцию для трех кнопок в приложении Shiny - PullRequest
0 голосов
/ 28 января 2020

У меня есть кнопка, связанная с наблюдаемым событием. Кнопка просто загружает электронную таблицу Excel, а затем загружает ее в виде информационного кадра. У меня есть три из этих кнопок. Каждый делает одно и то же. Я хотел бы создать функцию, которая выполняет загрузку, чтобы мне не приходилось определять ее два раза. Я просто не могу понять, как создать функцию, которая позволяет мне делать это в Shiny.

library(shiny)
library(shinydashboard)
library(shinyjs)
library(readxl)

ui <- fluidPage(

    titlePanel("My button issue"),

        mainPanel(
            box(status = "primary", solidHeader = TRUE,collapsible = T,collapsed=FALSE,title = "A. Upload data",
                fileInput("pathology",label="",multiple = FALSE),br()),
            box(status = "primary", solidHeader = TRUE,collapsible = T,collapsed=FALSE,title = "B. Upload data",
                fileInput("FileIn_endoscopy",label="",multiple = FALSE),br())

        )

)

server <- function(input, output) {
    observe({
        inFile_path <- input$pathology
        if (!is.null(inFile_path)) {   
            dataFile <- read_excel(inFile_path$datapath, sheet=1)
            RV2$data<-data.frame(dataFile, stringsAsFactors=FALSE)
            enable("textPrepPath")
        }
        else{disable("textPrepPath")}
    })

    observe({
        inFile_endoscopy <- input$FileIn_endoscopy
        if (!is.null(inFile_endoscopy)) {   
            dataFile <- read_excel(inFile_endoscopy$datapath, sheet=1)
            RV$data<-data.frame(dataFile, stringsAsFactors=FALSE)
            enable("textPrep")
        }
        else{disable("textPrep")}
    })


}

# Run the application 
shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 28 января 2020

У меня нет большого опыта работы с блестящими модулями, но я думаю, что это хороший подход. Ваш пример кода неполон, поэтому я не могу его протестировать, но, может быть, что-то вроде этого будет работать?

library(shiny)
library(shinydashboard)
library(shinyjs)
library(readxl)

fileButton <- function(id, title) {
  ns <- NS(id)
  tagList(
    box(status = "primary", solidHeader = TRUE,collapsible = T,collapsed=FALSE,title = title,
        fileInput(ns("inputfile"),label="",multiple = FALSE),br())
  )
}

file <- function(input, output, session) {
  observeEvent(input$inputfile, {
    inFile_path <- input$inputfile
    if (!is.null(inFile_path)) {   
      dataFile <- read_excel(inFile_path$datapath, sheet=1)
      RV2$data<-data.frame(dataFile, stringsAsFactors=FALSE)
      enable("textPrepPath")
    }
    else{disable("textPrepPath")}
  })
}

ui <- fluidPage(
  titlePanel("My button issue"),
  mainPanel(
    fileButton("pathology", "A. Upload data"),
    fileButton("FileIn_endoscopy", "B. Upload data")
  )
)

server <- function(input, output) {
  callModule(file, "pathology")
  callModule(file, "FileIn_endoscopy")
}

# Run the application 
shinyApp(ui = ui, server = server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...