Ошибка в ShinyApp: не удалось найти функцию

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

Я не мог решить, использовать ли «eventReactive» для каждой переменной, такой как pt_class, arm, freq и т. Д., Или использовать «ObservEvent» в начале, чтобы зафиксировать нажатие «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)

person Radwa Sharaf    schedule 21.05.2019    source источник


Ответы (1)


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

На первый взгляд, однако, 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. Кстати, вам не нужно делать входные переменные реактивными, потому что они уже есть.

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

person TimTeaFan    schedule 21.05.2019
comment
Вау, это уже так сильно помогло Hellwalker'у. Он очистил большую часть моего кода. Сейчас я прохожу и вношу изменения. Большое спасибо! - person Radwa Sharaf; 21.05.2019