2016-12-06 187 views
0

編輯以反映正在進行的討論。有條件聲明和嵌套Shiny

從我的服務器部分,我想用不同的公式,取決於單選按鈕選擇這就是所謂的input$beamSupport,進而改變配方,取決於x值。然而,我堅持使用語法。

我也知道我可以通過簡單地聲明「else ...」來修飾一些代碼,但是我想有可能擴展。

現在我得到錯誤信息「中,如果錯誤:參數爲長度爲零」

library(shiny) 

ui <- fluidPage(

    # Style tags for changing the slider 
    tags$style(HTML(".irs-bar {background: none}")), 
    tags$style(HTML(".irs-bar {border-top: none}")), 
    tags$style(HTML(".irs-bar {border-bottom: none}")), 
    tags$style(HTML(".irs-bar-edge {border: none}")), 
    tags$style(HTML(".irs-bar-edge {background: none}")), 


mainPanel(
    titlePanel("Beam Deflection Calculator"), 

    radioButtons("beamSupport", 
       label = ("Beam support type"), 
       choices = list("Simply supported" = 1, 
           "Cantilever" = 2), 
       selected = 1), 

    numericInput("num_W", # Load force, W 
       label = "Enter load force in N.", 
       value = 1), 

    numericInput("num_l", # Length of beam, l 
       label = "Enter beam length in m.", 
       value = 10), 

    numericInput("num_I", # Intertial moment, I (caps i) 
       label = "Enter moment of inertia in m^4.", 
       value = 0.001), 

    numericInput("num_E", 
       label = "Enter Young's modulus in GPa.", 
       value = 200), 

    uiOutput("slider"), # Sliders for a and x 

    textOutput("text_calc") 
) 
) 


server <- function(input, output, session) { 

    output$slider <- renderUI({ 
     tagList(# Need this for multiple reactive sliders 
      sliderInput("slider_a", 
         label = "Choose position, where to apply force, starting from left, in m.", 
         min = 0, 
         max = input$num_l, 
         value = 5, 
         step = 0.1), 

      sliderInput("slider_x", 
         label = "Calculate the deflection, at position starting from left, in m.", 
         min = 0, 
         max = input$num_l, 
         value = 5, 
         step = 0.1) 
     ) 
    }) 

    output$text_calc <- renderText({ 
     W <- input$num_W 
     l <- input$num_l 
     I <- input$num_I 
     E <- input$num_E * 10^9 
     a <- input$slider_a 
     x <- input$slider_x 

     cond <- x < a 

     if (input$beamSupport == 1){ 
      if (cond){ 
       return(paste("The deflection is =", 
         ((W*(l-a)*x)/(6*E*I*l))*(l**2-x**2-(l-a)**2) 
       )) 
      } 
      else{ 
       return(paste("The deflection is =", 
         ((W*a*(l-x))/(6*E*I*l))*(l**2-(l-x)**2-a**2) 
       )) 
      } 
     } 

     if (input$beamSupport == 2){ 
      if (cond){ 
       return(paste("The deflection is =", 
         ((W*x**2)/(6*E*I))*(3*a-x) 
       )) 
      } 
      else{ 
       return(paste("The deflection is =", 
         ((W*a**2)/(6*E*I))*(3*x-a) 
       )) 
      } 
     } 
    }) 
} 

shinyApp(ui = ui, server = server) 

回答

0

試試這個,也請注意,當您使用renderUI將被將獲得初始後評估參數會被加載,因此您的slider_aslider_x將爲空,直到此時爲止。

#rm(list = ls()) 
library(shiny) 

ui <- fluidPage(

    # Style tags for changing the slider 
    tags$style(HTML(".irs-bar {background: none}")), 
    tags$style(HTML(".irs-bar {border-top: none}")), 
    tags$style(HTML(".irs-bar {border-bottom: none}")), 
    tags$style(HTML(".irs-bar-edge {border: none}")), 
    tags$style(HTML(".irs-bar-edge {background: none}")), 


    mainPanel(
    titlePanel("Beam Deflection Calculator"), 

    radioButtons("beamSupport", 
       label = ("Beam support type"), 
       choices = list("Simply supported" = 1, 
           "Cantilever" = 2), 
       selected = 1), 

    numericInput("num_W", # Load force, W 
       label = "Enter load force in N.", 
       value = 1), 

    numericInput("num_l", # Length of beam, l 
       label = "Enter beam length in m.", 
       value = 10), 

    numericInput("num_I", # Intertial moment, I (caps i) 
       label = "Enter moment of inertia in m^4.", 
       value = 0.001), 

    numericInput("num_E", 
       label = "Enter Young's modulus in GPa.", 
       value = 200), 

    uiOutput("slider"), # Sliders for a and x 

    textOutput("text_calc") 
) 
) 


server <- function(input, output, session) { 

    output$slider <- renderUI({ 
    tagList(# Need this for multiple reactive sliders 
     sliderInput("slider_a", 
        label = "Choose position, where to apply force, starting from left, in m.", 
        min = 0, 
        max = input$num_l, 
        value = 5, 
        step = 0.1), 

     sliderInput("slider_x", 
        label = "Calculate the deflection, at position starting from left, in m.", 
        min = 0, 
        max = input$num_l, 
        value = 5, 
        step = 0.1) 
    ) 
    }) 

    output$text_calc <- renderText({ 
    if(is.null(input$slider_a) || is.null(input$slider_x)){ 
     return() 
    } 
    W <- input$num_W 
    l <- input$num_l 
    I <- input$num_I 
    E <- input$num_E * 10^9 
    a <- input$slider_a 
    x <- input$slider_x 

    cond <- x < a 

    if (input$beamSupport == 1){ 
     if (cond){ 
     return(paste("The deflection is =", 
        ((W*(l-a)*x)/(6*E*I*l))*(l**2-x**2-(l-a)**2) 
     )) 
     } 
     else{ 
     return(paste("The deflection is =", 
        ((W*a*(l-x))/(6*E*I*l))*(l**2-(l-x)**2-a**2) 
     )) 
     } 
    } 

    if (input$beamSupport == 2){ 
     if (cond){ 
     return(paste("The deflection is =", 
        ((W*x**2)/(6*E*I))*(3*a-x) 
     )) 
     } 
     else{ 
     return(paste("The deflection is =", 
        ((W*a**2)/(6*E*I))*(3*x-a) 
     )) 
     } 
    } 
    }) 
} 

shinyApp(ui = ui, server = server) 

enter image description here

+0

謝謝!它現在似乎工作。我仍然得到*「警告:錯誤在if:參數的長度爲零」*雖然。這是什麼意思? –

+0

如果你運行我的代碼,一切工作正常,你必須做一些額外的事情。這意味着你沒有照顧'null',比如:'if(input $ SOME_INPUT == null){return()} –

+0

我找不到錯誤。我已經完成了與你完全相同的事情,除了一些重命名。所有參數都有非零的默認值,所以我需要包含null的位置?全部輸出是'堆棧跟蹤(最內第一): 79:renderText [〜/桌面/ beamDeflection/beamDeflection.R#85] 78:FUNC 77:origRenderFunc 76:輸出$ text_calc 1:runApp' –