Isolate () не работает при использовании внутри оператора if в блестящем приложении - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть блестящее приложение ниже, в котором у меня есть 3 файла ввода и 2 кнопки действия.

1-я кнопка отправки «submit» используется для запуска древовидного графика, а 2-я кнопка «reset» для сброса каждого входного файла.

Когда 1-я кнопка действия пуста, я получаю предупреждение.

Дерево отображается только в том случае, если загружены все файлы или загружены 1-й и 2-й или загружен только 1-й. Основываясь на этом, я составил оператор if, который можно найти в строке 120. Проблема заключается в том, что, хотя приложение работает нормально, оно не следует кнопке отправки, и графики отображаются автоматически. Если я запускаю его только для одного случая, скажем:

jsonedit(jsonlite::fromJSON(SACCR::SACCRCalculator(isolate(input$inFile$datapath),isolate(input$inFile2$datapath),isolate(input$inFile3$datapath), JSON=TRUE)))

, он работает нормально. Поэтому я предполагаю, что проблема заключается в утверждениях if:

library(shiny)
library(shinyjs)
library(tidyverse)
library(listviewer)
library(jsonlite)
library(SACCR)
ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
  useShinyjs(),
  fileInput('inFile', 'Choose 1st file'),
  fileInput('inFile2', 'Choose 2nd file'),
  fileInput('inFile3', 'Choose 3rd file'),
  actionButton('submit', 'Submit'),
  tags$hr(),
  actionButton('reset', 'Reset')
    ),
  mainPanel(
    #This hides the temporary warning messages while the plots are being created
    tags$style(type="text/css",
               ".shiny-output-error { visibility: hidden; }",
               ".shiny-output-error:before { visibility: hidden; }"
    ),
    uiOutput("choose"),
    jsoneditOutput( "choose2" )
  )
)
)

server <- function(input, output, session) {

  rv <- reactiveValues(
    data = NULL,
    clear = FALSE
  )
  rv2 <- reactiveValues(
    data = NULL,
    clear = FALSE
  )
  rv3 <- reactiveValues(
    data = NULL,
    clear = FALSE
  )
  ########1st
  observe({
    req(input$inFile)
    req(!rv$clear)

      rv$data <- read.csv(input$inFile$datapath,header = T)



  })

  observeEvent(input$inFile, {
    rv$clear <- FALSE
  }, priority = 1000)

  observeEvent(input$reset, {
    rv$data <- NULL
    rv$clear <- TRUE
    reset('inFile')
  }, priority = 1000)


  #############2nd
  observe({
    req(input$inFile2)
    req(!rv2$clear)

    rv2$data <- read.csv(input$inFile2$datapath,header = T)



  })

  observeEvent(input$inFile2, {
    rv2$clear <- FALSE
  }, priority = 1000)

  observeEvent(input$reset, {
    rv2$data <- NULL
    rv2$clear <- TRUE
    reset('inFile2')
  }, priority = 1000)


  ##############3rd
  observe({
    req(input$inFile3)
    req(!rv3$clear)

    rv3$data <- read.csv(input$inFile3$datapath,header = T)



  })

  observeEvent(input$inFile3, {
    rv3$clear <- FALSE
  }, priority = 1000)

  observeEvent(input$reset, {
    rv3$data <- NULL
    rv3$clear <- TRUE
    reset('inFile3')
  }, priority = 1000)

  output$choose <- renderUI ({
    if(is.null(rv$data))
    {
      "You must upload 1st csv at least"
    }
    else
    {
      return(NULL)

    }
  })
  log<-eventReactive({input$submit 
input$reset}, {
if(is.null(isolate(rv$data))){
  return(NULL)
}
if(!is.null(isolate(rv$data))){

  if(!is.null(isolate(rv2$data))&is.null(isolate(rv3$data))){
    jsonedit(jsonlite::fromJSON(SACCR::SACCRCalculator(input$inFile$datapath,input$inFile2$datapath, JSON=TRUE)))
  }
  else if(is.null(isolate(rv2$data))&!is.null(isolate(rv3$data))){
    return(NULL)
  }
  else if(!is.null(isolate(rv2$data))&!is.null(isolate(rv3$data))){
    jsonedit(jsonlite::fromJSON(SACCR::SACCRCalculator(input$inFile$datapath,input$inFile2$datapath,input$inFile3$datapath, JSON=TRUE)))

  }
  else if(is.null(isolate(rv2$data))&is.null(isolate(rv3$data))){

    jsonedit(jsonlite::fromJSON(SACCR::SACCRCalculator(input$inFile$datapath, JSON=TRUE)))

  }
}

})

  output$choose2<-renderJsonedit({

    log()
  })
}

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