почему не работает функция seq () вinyApps? - PullRequest
1 голос
/ 03 мая 2020

Я попытался создатьосветное приложение с функцией seq() в приложениях.

header <- dashboardHeader(title = 'Testing' ,titleWidth = 300)
sidebar <- dashboardSidebar(uiOutput("sidebarpanel"), width = 300)
body <- dashboardBody(uiOutput("body"))
uix <- dashboardPage(header, sidebar, body)

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

  output$sidebarpanel <- renderUI({
    div(
      sidebarMenu(id="tabs",
                  menuItem("Tes 1", tabName = "tes1", icon = icon("dashboard"), selected = TRUE)
                  )
    )
  })

  output$body <- renderUI({
    tabItems(tabItem(tabName = "tes1",
                      fluidRow(column(2, textInput("s1", "From :", value = 1))
                                ,column(2, textInput("s2", "To", value = 7))
                      ),
                      textOutput("result")
             )
    )
    })

  segment_low <- reactiveValues(ba=NULL)
  segment_high <- reactiveValues(ba=NULL)
  results <- reactiveValues(ba=NULL)

  toListen <- reactive({
    list(input$s1, input$s2)
  })

   observeEvent(toListen(),{
    segment_low$ba <- input$s1 %>% as.numeric()
    segment_high$ba <- input$s2 %>% as.numeric()
  })

  observe({
    results$ba <- seq(segment_low$ba,segment_high$ba, 1)
  })

  output$result <- renderText({
    results$ba 
  })

  }

shinyApp(uix, serverx)

В этом синтаксисе я бы создал переменную с именем results$ba, потому что я хочу увеличить это значение в следующем время. Но получается ошибка:

Warning: Error in seq.default: 'from' must be of length 1
  [No stack trace available]

Может кто-нибудь помочь мне, как решить эту проблему? Поскольку эта ошибка произошла только в том случае, если я поместил реактивные значения в функцию seq(), а при вводе ввода c, например seq(2,5,1), ошибка не будет возвращена. И я уже поместил начальные значения value для каждого входа в функцию textInput().

Kindle нужна ваша помощь, разработчики! Большое спасибо.

1 Ответ

1 голос
/ 03 мая 2020

Проблема в том, что вы рендерите входные данные s1 и s2 на стороне сервера. Из-за этого сервер в начале отображает их как NULL, а ваши seq ошибки функций, когда он получает значение NULL.

Самое простое, что нужно сделать, это добавить req функция, предотвращающая оценку вашего кода, если только он не получает ненулевых значений.

    observe({
        req(segment_low$ba, segment_high$ba)
        results$ba <- seq(segment_low$ba,segment_high$ba, 1)
    })

По сути, поскольку вы используете наблюдение, которое очень активно, вы говорите функции seq для правильной оценки прочь. Используя функцию req, вы препятствуете выполнению цепочки оценки, за исключением того, что для plot_low $ ba иgment_high $ ba значения не равны NULL.

...