我整天都在苦苦挣扎,我有点解决它(可怕的黑客)。然而,经验并不顺畅,并且会出现副作用。
我想要的是三个滑块,其范围为0到100约束,使得它们的总和应该始终为100.
这是
这是server.R闪亮代码。
library(shiny)
oldState<-NULL
newState<-NULL
getState<-function(input) c(input$slider1, input$slider2, input$slider3)
# Define server logic required
shinyServer(function(input, output, session) {
observe({
newState<<-getState(input)
i<-which(oldState-newState != 0)[1]
if(!is.na(i)){
rem <- 100-newState[i]
a<-sum(newState[-i])
if(a==0) newState[-i]<<-rem/length(newState[-i])
else newState[-i]<<-rem*(newState[-i]/a)
for(j in 1:length(newState))
if(j!=i)
updateSliderInput(session, paste0("slider", j), value=newState[j])
}
oldState<<-newState
})
output$restable <- renderTable({
myvals<-getState(input)
myvals<-c(myvals, sum(myvals))
data.frame(Names=c("Slider 1", "Slider 2", "Slider 3", "Sum"),
Values=myvals)
})
})
这是ui.R闪亮代码
library(shiny)
# Define UI for application
shinyUI(pageWithSidebar(
# Application title
headerPanel("Sliders should sum to 100!"),
# Sidebar with sliders whos sum should be constrained to be 100
sidebarPanel(
sliderInput("slider1", "Slider 1: ", min = 0, max = 100, value = 40, step=1),
sliderInput("slider2", "Slider 2: ", min = 0, max = 100, value = 30, step=1),
sliderInput("slider3", "Slider 3: ", min = 0, max = 100, value = 30, step=1)
),
# Create table output
mainPanel(
tableOutput("restable")
)
))
现在除了两件事之外,它几乎应该做的事情:
如何解决这两个问题?
答案 0 :(得分:4)
我认为使用dynamicUI可能会解决您的问题。
如果您知道需要正好3个输入总和为1,那么您可以将用户限制为仅两个滑块输入,并使第二个滑块输入在第一个输入上,如下所示。使用您的代码模板:
<强> server.R 强>
library(shiny)
# Define server logic required
shinyServer(function(input, output) {
output$slider2 <- renderUI {
sliderInput("slider2", "Slider 2", min = 0, max = 100 - input$slider1, value = 0)
})
output$restable <- renderTable({
myvals<- c(input$slider1, input$slider2, 100-input$slider1-input$slider2)
data.frame(Names=c("Slider 1", "Slider 2", "Slider 3"),
Values=myvals)
})
})
此处的关键是renderUI
函数,该函数会查找input$slider1
值以约束slider2
的值(因此slider3
)
<强> ui.R 强>
library(shiny)
# Define UI for application
shinyUI(pageWithSidebar(
# Application title
headerPanel("Sliders should sum to 100!"),
# Sidebar with sliders whos sum should be constrained to be 100
sidebarPanel(
sliderInput("slider1", "Slider 1: ", min = 0, max = 100, value = 0, step=1),
uiOutput("slider2")
),
# Create table output
mainPanel(
tableOutput("restable")
)
))
如附图中所示(如果您眯着眼睛),slider2
被限制为0-35,slider1
被设置为65。
答案 1 :(得分:0)
所有这些想法都有帮助,但我的直觉是使用 tagList
。算法是这样运行的,
observe {...}
下的滑块小部件更改(在服务器中),请确定是哪个小部件。x/(n-1)
。希望这会有所帮助。将尽快更新代码。