R Shiny - Операция не допускается без активного реактивного контекста - PullRequest
0 голосов
/ 15 марта 2020

Я впервые создаю приложение, и я получаю следующее сообщение об ошибке:

Ошибка в .getReactiveEnvironment () $ currentContext (): операция не разрешена без активного реактивного контекста. (Вы пытались сделать что-то, что можно сделать только из реактивного выражения или наблюдателя.)

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

Начало интерфейса

header = dashboardHeader(title = "Fifa player valuation")

sidebar = dashboardSidebar(
  sidebarMenu(
    menuSubItem("Player Valuation - Striker", tabName = "StrikerTab"),
    menuSubItem("Player Valuation - Midfielder", tabName = "MidfielderTab"),
    menuSubItem("Player valuation - Goalkeeper", tabName = "GkTab")
  )
)

ageSlider = sliderInput('age', 'Enter your age in years', min = 0, max = 150, value = 25)

dribblingSlider = sliderInput('dribbling_skills', 'Enter your dribbling skills', min = 0, max = 100, value = 70)

tacklingSlider = sliderInput('tackling_skills', 'Enter your tackling skills', min = 0, max = 100, value = 70)

shootingSlider= sliderInput("shooting_skills", "Enter your shooting skills", min = 0, max = 100, value = 70)

body = dashboardBody(
  tabItems(
    tabItem(tabName = "StrikerTab",ageSlider,dribblingSlider, tacklingSlider, shootingSlider,verbatimTextOutput("strikerValue")),
    tabItem(tabName = "MidfielderTab",ageSlider,dribblingSlider, tacklingSlider),
    tabItem(tabName = "GkTab", ageSlider, gkSlider)
  ),
  verbatimTextOutput("playerValueTxt")
)

ui = dashboardPage(header, sidebar, body, skin = "green")

Конец интерфейса

Запуск сервера

strikerProjectedValue = function(age, dribbling, tackling = 0, shooting = 0){
  return (-250.19*age) + (1987.33*dribbling) + (4439.32*tackling) + (3232.44*shooting)
}

server = function(input, output) {
  predictedStrikerValue = strikerProjectedValue(input$age, 150)
  output$strikerValue = renderPrint(predictedStrikerValue)
}

1 Ответ

0 голосов
/ 15 марта 2020

Возможно, кто-то с большим количеством программирования, особенно с блестящим программированием, может дать вам лучший ответ. По моему мнению, ваш вопрос может использовать некоторые пояснения, мне немного непонятно, какие именно результаты вы хотите / какова ваша рациональность за этим кодом. Несмотря на это, я постараюсь дать ответ. Возможно, некоторые из вещей, которые я упоминаю, являются «личными», так как я бы не стал программировать блеск таким образом.

Лично я бы не использовал функцию в Shiny, скорее используйте оператор reactive({}) . Я не знаю, почему вы бы предпочли эту функцию, а не реактивную, тем более что у вас много слайдеров, которые вы нигде не используете. Так какой смысл иметь все эти выражения в вашей функции? Кроме того, я не очень понимаю, почему вы хотите, чтобы каждый шаг был записан в отдельный вектор. В частности, я имею в виду часть

predictedStrikerValue = strikerProjectedValue(input$age, 150)
  output$strikerValue = renderPrint(predictedStrikerValue)

Возможно, у вас есть планы использовать их позже, но опять же, что не ясно из вашего описания. Почему бы не поставить renderPrint(strikerProjectedValue(input$age, 150))? (именно поэтому я и сказал в начале, что ваш вопрос может нуждаться в дополнительном объяснении;), потому что для этого может быть разумное объяснение).

Чтобы заставить ваш код работать, я заменил все в вашем коде сервера на

   output$strikerValue = renderText((-250.19*input$age) + 
                                        (1987.33*input$dribbling_skills) + 
                                        (4439.32*input$tackling_skills) + 
                                        (3232.44*input$shooting_skills))

Чтобы получить то же самое, что и в вашей функции, вы должны будете сначала поставить ползунки на 0.

Другой способ сделать это, который больше похож на вашу начальную функцию:

  predictedStrikerValue<- reactive({(-250.19*input$age) + (1987.33*input$dribbling_skills)
  })

   output$strikerValue = renderText(predictedStrikerValue())

Подобно приведенному выше коду, вы можете добавить все остальные части функции, чтобы получить его полностью реактивный.

...