Ошибка в ShinyApp: не удалось найти функцию - PullRequest
0 голосов
/ 21 мая 2019

Это ShinyApp, который выводит график и таблицу на основе пользовательского ввода.Как только пользователь нажимает «перейти», значения обновляются.

Я не определился между использованием «eventReactive» для каждой переменной, такой как pt_class, arm, freq и т. Д., По сравнению с использованием вначале «наблюдающего события» для захвата нажатия «go» один раз.Я выбрал последнее, но у меня возникли проблемы с пониманием, почему возникает эта ошибка:

Warning: Error in freq: could not find function "freq"
  72: observeEventHandler [~/ShinyApp/app.R#108]
   1: runApp 

Как вы можете видеть в приведенном ниже коде, я уже определил "freq" ... Заранее извиняюсь, поскольку приложение полагаетсяна других скриптах Python, но я рад поделиться ими, если они необходимы для диагностики проблемы.

ui <- navbarPage(numericInput(inputId = "vl",
                             "Viral load threshold (copies/mL):", value = 1000, min=50, max=10000000),
                             radioButtons("one_or_duration", "Duration at or above viral load threshold:",
                                          c("A single measurement","Multiple measurements")),
                             radioButtons("pt_class", "Time of treatment:",
                             c("All study participants","Early treated participants","Chronic treated participants")),
                             br(),
                             radioButtons("nnrti", "Include participants on NNRTIs?",
                                          c("No, exclude participants on NNRTIs","Yes, include participants on NNRTIs")),
                             radioButtons("freq", "Expected frequency of post-treatment controllers:",
                                          c("Same frequency as observed by authors","Input expected frequency")),
                             actionButton(inputId="go",label="Go!"),

                             mainPanel(
                             plotOutput(outputId = "graph"), DT::dataTableOutput(outputId="table")))

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


  observeEvent(input$go,{

  one_or_duration <- 
              if(input$one_or_duration == "A single measurement"){
              "single"}
              else if(input$one_or_duration == "Multiple measurements"){
              "multiple"}

  nnrti <- 
    if(input$nnrti == "Yes, include participants on NNRTIs"){
      "yes"}
    else if(input$nnrti == "No, exclude participants on NNRTIs"){
      "no"}

  freq <- 
    if(input$freq == "Same frequency as observed by authors"){
      "same"}
    else if(input$freq == "Input expected frequency"){
      "diff"}

  pt_class <- 
    if(input$pt_class == "All study participants"){
      "all"}
    else if(input$pt_class == "Early treated participants"){
      "early"}
    else if(input$pt_class == "Chronic treated participants"){
      "chronic"}

  ptcs_plus_ncs <- 
    if (freq() == "same"){do_this
}


})}

shinyApp(ui = ui, server = server)

1 Ответ

1 голос
/ 21 мая 2019

В текущей форме я не могу запустить ваш код, поэтому не могу заглянуть глубже в проблему.

Однако, на первый взгляд, R пропустил ошибку, поскольку вы не определяете freq какреактивный, но все же ссылается на него как freq(), что заставляет R искать функцию с именем freq.То же самое относится к ряду других переменных, таких как pt_class(), one_or_duration(), nnrti(), arm() и т. Д.

Часть с observeEvent(input$go,{ довольно проблематична, и кажется, что вы нене нужны условия if.Вместо этого используйте именованные векторы во входных значениях пользовательского интерфейса.Например, вместо

radioButtons("one_or_duration", "Duration at or above viral load threshold:",
             c("A single measurement","Multiple measurements"))

напишите

radioButtons("one_or_duration", "Duration at or above viral load threshold:",
             c("A single measurement" = "single",
               "Multiple measurements" = "multiple"))

, и тогда вам не понадобится часть с надписью

one_or_duration <- 
              if(input$one_or_duration == "A single measurement"){
              "single"}
              else if(input$one_or_duration == "Multiple measurements"){
              "multiple"}

и позже вместо использования one_or_duration()(который не является реактивным и не может быть вызван добавлением скобок), просто используйте input $ one_or_duration.Кстати, вам не нужно делать входные переменные реактивными, потому что они уже есть.

Это определенно не решает всех проблем вашего кода, но это может быть началом.

...