Я пытаюсь создать блестящее приложение с несколькими ползунками для управления несколькими ограниченными весами (то есть они должны составлять до 1).Попытка моего непрофессионала, приведенная ниже, «работает», но запускается в бесконечный цикл, когда один из параметров принимает экстремальные значения (0 или 1).
Вместо этого я попытался использовать реактивный кэш, но впоследствии «наблюдался» только первый изменяемый ползунок.Несколько случайных звонков в одиночку ни к чему не привели.Мне все еще нужно полностью понять, как работает процесс обновления.: /
Я видел реализацию для двух дополнительных ползунков, но мне не удалось обобщить ее для многих.
Любая помощь будет оценена!Бест, Мартин
library(shiny)
states <- c('W1', 'W2', 'W3')
cache <- list()
hotkey <- ''
forget <- F
ui =pageWithSidebar(
headerPanel("Test 101"),
sidebarPanel(
sliderInput(inputId = "W1", label = "PAR1", min = 0, max = 1, value = 0.2),
sliderInput(inputId = "W2", label = "PAR2", min = 0, max = 1, value = 0.2),
sliderInput(inputId = "W3", label = "PAR3", min = 0, max = 1, value = 0.6)
),
mainPanel()
)
server = function(input, output, session){
update_cache <- function(input){
if(length(cache)==0){
for(w in states)
cache[[w]] <<- input[[w]]
} else if(input[[hotkey]] < 1){
for(w in states[!(states == hotkey)]){
if(forget==T){
newValue <- (1-input[[hotkey]])/(length(states)-1)
} else{
newValue <- cache[[w]] * (1 - input[[hotkey]])/(1-cache[[hotkey]])
}
cache[[w]] <<- ifelse(is.nan(newValue),0,newValue)
}
forget <<- F
cache[[hotkey]] <<- input[[hotkey]]
} else{
for(w in states[!(states == hotkey)]){
cache[[w]] <<- 0
}
forget <<- T
}
}
# when water change, update air
observeEvent(input$W1, {
hotkey <<- "W1"
update_cache(input)
for(w in states[!(states == hotkey)]){
updateSliderInput(session = session, inputId = w, value = cache[[w]])
}
})
observeEvent(input$W2, {
hotkey <<- "W2"
update_cache(input)
for(w in states[!(states == hotkey)]){
updateSliderInput(session = session, inputId = w, value = cache[[w]])
}
})
observeEvent(input$W3, {
hotkey <<- "W3"
update_cache(input)
for(w in states[!(states == hotkey)]){
updateSliderInput(session = session, inputId = w, value = cache[[w]])
}
})
}
shinyApp(ui = ui, server = server)