2016-11-15 99 views
0

我试图创建两个值相互依赖的renderUI筛选器。我有两个过滤器:百分比和值。 百分比应为:value/total_amount,值应为total_amount*percentage。我需要这个,因为有时候用户想要填写一个它想要的数字,有时候它需要占总数的百分比。我总是想要展示两者。 例如,如果用户在百分比过滤器中填充了.20,我想在值过滤器中显示20。如果用户在值过滤器中填充80,我想在百分比过滤器中显示.8。 所以我希望这两个可以结合..我试着这个代码,但它显然不工作。让两个renderui数字输入互相反应闪亮

server <- function(input, output) { 

    total_amount<-100 


    output$percentage<-renderUI({ 

    myvalue<- input$value/total_amount 
    if(is.null(myvalue))myvalue<-.2 
    # myvalue<-.2 
    #browser() 
    numericInput('percentage','percentage',value = myvalue) 
    }) 

    output$value<-renderUI({ 

    myvalue<- input$percentage*total_amount 
    if(is.null(myvalue))myvalue<-100 
    # myvalue<-100 
    numericInput('value','value',value = myvalue) 
    }) 

} 

    ui <- fluidPage(
    sidebarLayout(
    sidebarPanel(
     uiOutput('percentage'), 
     uiOutput('value') 

    ) 
    # ,mainPanel(plotOutput("distPlot")) 
) 
) 

    shinyApp(ui = ui, server = server) 

回答

1

只需添加百分比的默认值并确保小部件有一个值。

library(shiny) 

server <- function(input, output) { 

    total_amount <- 100 
    percentage <- 0.2 

    output$percentage <- renderUI({ 
    if(is.null(input$value)) { 
     myvalue <- percentage 
    } else { 
     myvalue <- input$value/total_amount 
    } 
    numericInput('percentage', 'percentage', value = myvalue) 
    }) 

    output$value <- renderUI({ 
    if(is.null(input$percentage)) { 
     myvalue <- percentage*total_amount 
    } else { 
     myvalue <- input$percentage*total_amount 
    } 
    numericInput('value', 'value', value = myvalue) 
    }) 

} 

ui <- fluidPage(
    sidebarLayout(
    sidebarPanel(
     uiOutput('percentage'), 
     uiOutput('value') 

    ) 
    ,mainPanel() 
) 
) 

shinyApp(ui = ui, server = server) 
+0

它确实工作,谢谢。但由于某种原因,它在我的真实应用中不断更新。我认为这是因为四舍五入... –