Избавиться от сообщения об ошибке «аргумент нулевой длины» в консоли R - PullRequest
1 голос
/ 26 февраля 2020

Ниже у меня блестящее приложение, в котором отображаются 2 цифры c. Приложение работает нормально, так как, когда сумма не 40, отображается сообщение об ошибке. Что раздражает, и я хотел бы избавиться от этого сообщения об ошибке

Warning: Error in if: argument is of length zero

, которое появляется в консоли r, когда я запускаю приложение в первый раз. Я знаю, что это происходит от line 38 и связано со значениями NULL в начале. Интересно, что это сообщение об ошибке не отображается, когда я не использую renderUI() для 2 цифр c входов. Но мне нужно, чтобы они были такими в моем случае.

library(shiny)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      #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("factors_weight_one_two"),
      htmlOutput('weight_message')
    ),
    mainPanel(

    )
  )
)

server <- function(input, output) {
  output$factors_weight_one_two <- renderUI({
    fluidRow(
      column(6, numericInput(
        "factors_weight_one",
        "Factor 1", 20, 
        min = 1, max = 100,
        width = "90%")),
      column(6, numericInput(
        "factors_weight_two",
        "Factor 2", 20, 
        min = 1, max = 100,
        width = "90%"))
    )
  })
  output$weight_message <- renderText({

      if(!is.null(as.numeric(input$factors_weight_one) + as.numeric(input$factors_weight_two) ) & as.numeric(input$factors_weight_one) + as.numeric(input$factors_weight_two)  != 40){
        sprintf('<font color="%s">%s</font>', 'red', "Your weights don't sum to 40")
      }  else {
        sprintf('<font color="%s">%s</font>', 'red', "")
      }

  })

}

shinyApp(ui, server)

1 Ответ

1 голос
/ 26 февраля 2020

Как насчет замены части server на эту

server <- function(input, output) {
  output$factors_weight_one_two <- renderUI({
    fluidRow(
      column(6, numericInput(
        "factors_weight_one",
        "Factor 1", 20,
        min = 1, max = 100,
        width = "90%")),
      column(6, numericInput(
        "factors_weight_two",
        "Factor 2", 20,
        min = 1, max = 100,
        width = "90%"))
    )
  })
  output$weight_message <- renderText({

      req(input$factors_weight_one, input$factors_weight_two)

      if (input$factors_weight_one + input$factors_weight_two  != 40) {
        sprintf('<font color="%s">%s</font>', 'red', "Your weights don't sum to 40")
      }  else {
        sprintf('<font color="%s">%s</font>', 'red', "")
      }

  })

}

Я использую req для проверки «истинности» input$factors_weight_one и input$factors_weight_two. Кстати, вам не нужно as.numeric для ввода ввода numericInput, потому что это уже numeric.

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