2012-12-16 45 views
12

更新 - 2012年12月17日上午9點CDT:示例已更新演示數據並已滿碼。 [/ update]。閃亮的ui.R - 錯誤標記(「div」,列表(...)) - 不知道錯誤的位置

示例數據:https://gist.github.com/4318774

說明: 我一直在用新的閃亮包玩耍(!喜歡它),但是還不知道我發現了一個錯誤,當我runApp("")。錯誤是Error in tag("div", list(...)): argument is missing

我正在嘗試爲人口統計數據的圖形化探索創建一個交互式網絡應用程序。我使用的是以下內容作爲指南:
https://gist.github.com/4026749
http://rstudio.github.com/shiny/tutorial/

options(error= recover),我得到:

Listening on port 8100 
Error in tag("div", list(...)) : argument is missing, with no default 

Enter a frame number, or 0 to exit 

1: runApp("//~~my app~~") 
2: tryCatch(while (TRUE) { 
    serviceApp(ws_env) 
}, finally = { 
    timerCallbacks$clear() 
    websocket_close(ws_env) 
}) 
3: tryCatchList(expr, classes, parentenv, handlers) 
4: serviceApp(ws_env) 
5: service(server = ws_env, timeout = timeout) 
6: server$static(j, J$wsinfo) 
7: handler(ws, header) 
8: handler(ws, header) 
9: local({ 
    cacheContext$with(function() { 
     source(filePath, local = new.env(parent = .GlobalEnv)) 
    }) 
}) 
10: eval.parent(substitute(eval(quote(expr), envir))) 
11: eval(expr, p) 
12: eval(expr, envir, enclos) 
13: eval(quote({ 
    cacheContext$with(function() { 
     source(filePath, local = new.env(parent = .GlobalEnv)) 
    }) 

14: eval(expr, envir, enclos) 
15: cacheContext$with(function() { 
    source(filePath, local = new.env(parent = .GlobalEnv)) 
}) 
16: func() 
17: source(filePath, local = new.env(parent = .GlobalEnv)) 
18: withVisible(eval(ei, envir)) 
19: eval(ei, envir) 
20: eval(expr, envir, enclos) 
21: ui.R#6: shinyUI(pageWithSidebar(headerPanel("Demographics Web Demo - Eglin Data"), sidebarPanel(textInput("plot.ti 
22: force(ui) 
23: pageWithSidebar(headerPanel("Demographics Web Demo - Eglin Data"), sidebarPanel(textInput("plot.title", "Title:", 
24: bootstrapPage(div(class = "container-fluid", div(class = "row-fluid", headerPanel), div(class = "row-fluid", sideb 
25: tagList(importBootstrap(), list(...)) 
26: div(class = "container-fluid", div(class = "row-fluid", headerPanel), div(class = "row-fluid", sidebarPanel, mainP 
27: tags$div(...) 
28: tag("div", list(...)) 
29: div(class = "row-fluid", sidebarPanel, mainPanel) 
30: tags$div(...) 
31: tag("div", list(...)) 
32: sidebarPanel(textInput("plot.title", "Title:", "Population Pyramid of Members"), wellPanel(p(strong("Demographic o 
33: div(class = "span4", tags$form(class = "well", ...)) 
34: tags$div(...) 
35: tag("div", list(...)) 
36: tags$form(class = "well", ...) 
37: tag("form", list(...)) 
38: wellPanel(p(strong("Demographic of Interest")), checkboxInput(inputId = "age_dist", label = "Age Distribution", va 
39: div(class = "well", ...) 
40: tags$div(...) 
41: tag("div", list(...)) 

我試圖調查發生了什麼事情,但checkboxInput使代碼看起來準確嗎?。這也幾乎是 「股票」 的例子來自RStudio(GitHub的上面鏈接)直接複製

ui.R/Server.R代碼:
ui.R

library(shiny) 

shinyUI(pageWithSidebar(
    # application title 
    headerPanel("Demographics Web Demo - Eglin Data"), 

    # sidebar with controls to allow user to define graphical elements and how 
    # they want them displayed. 
    sidebarPanel(
    # allow the user to write a plot Title 
    textInput("plot.title", "Title:", "Population Pyramid of Members"), 

    # allow the user to determine which demographic they want to plot 
    wellPanel(
     p(strong("Demographic of Interest")), 
     checkboxInput(inputId = "age_dist", label = "Age Distribution",  value = TRUE), 
     checkboxInput(inputId = "wealth_dist", label = "Household Wealth",  value = FALSE), 
     checkboxInput(inputId = "home_val", label = "Home Value",   value = FALSE), 
     checkboxInput(inputId = "ed_level", label = "Members' Education", value = FALSE), 
     checkboxInput(inputId = "inc_level", label = "Members' Est. Income", value = FALSE), 
     checkboxInput(inputId = "h_own",  label = "Homeownership",   value = FALSE), 
    ), 

    # allow the user to determine age-bracket size. Input used in plotting 
    sliderInput("age_cut", "Select Size of Age Brackets:", 
       min= 3, max= 20, value= 5), 

    # allow the user to subset their demographics by age range 
    #sliderInput("age_sub", "Please select the age range you would like to 'zoom-in' on:", 
    #   min= 0, max= 120, value= c(15,65)), 
), 


    # display the appropriate graphics based on the user selections defined 
    # above. 
    mainPanel(
    h3(textOutput("caption")), 

    conditionalPanel(condition= "input.age_dist", 
        plotOutput(outputId= "plot_age")), 
    conditionalPanel(condition= "input.wealth_dist", 
        plotOutput(outputId= "plot_wealth")), 
    conditionalPanel(condition= "input.home_val", 
        plotOutput(outputId= "plot_home_value")), 
    conditionalPanel(condition= "input.ed_level", 
        plotOutput(outputId= "plot_edu")), 
    conditionalPanel(condition= "input.inc_level", 
        plotOutput(outputId= "plot_inc")), 
    conditionalPanel(condition= "input.h_own", 
        plotOutput(outputId= "plot_h_own")) 
) 
)) 

server.R

# require packages 
if (!require(ggplot2)) { 
    stop("This application requires ggplot2. To install it, please run 'install.packages(\"ggplot2\")'.\n") 
} 
if (!require(plotrix)) { 
    stop("This application requires plotrix. To install it, please run 'install.packages(\"plotrix\")'.\n") 
} 
library(shiny) 

# load example demo data 
load("~~you'll need to load the test data here") 


shinyServer(function(input, output) { 

    # reactive function based on user input for plot title 
    # This function is automatically called to update the display 
    output$caption <- reactiveText(function() { 
    input$plot.title 
    }) 

    updateAge_f <- reactive(function() { 
    # re-define age brackets based on user input 
    demos$age_f <- ordered(cut(demos$age, breaks= c(seq(0, max(demos$age), input$age_cut)), 
           include.lowest= T)) 
    }) 

    # Generate a plot of the Members' age distribution 
    output$plot_age <- reactivePlot(function() { 
    # call to update age factor if needed 
    updateAge_f() 
    # develop input vectors 
    male <- as.vector(table(demos$age_f, demos$female_flag)[,1]/summary(demos$female_flag)[1] * 100) 
    women <- as.vector(table(demos$age_f, demos$female_flag)[,2]/summary(demos$female_flag)[2] * 100) 
    # create plot 
    pyramid.plot(lx= male, rx= women, 
       labels= levels(demos$age_f), 
       lxcol= "blue", rxcol= "pink", 
       main= "Population Pyramid of Members", 
       gap= 2, labelcex= .75) 
    }) 

    # generate a plot of members' wealth codes 
    output$plot_wealth <- reactivePlot(function() { 
    # call to update age factor if needed 
    updateAge_f() 

    if (input$factor_age == TRUE) { 
     ggplot(demos2, aes(wealth)) + geom_bar() + 
     facet_wrap(~ age_f, ncol= 3) + theme_bw() + 
     labs(title= "Wealth of Members by Age Bracket", 
      y= "Count of Individuals", 
      x= "Decile of Wealth (by State)") + 
     theme(axis.text.x= element_text(angle= 90)) 
    } else if (input$factor_age == FALSE) { 
     ggplot(demos2, aes(wealth)) + geom_bar() + 
     theme_bw() + 
     labs(title= "Wealth of Members of your Members", 
      y= "Count of Individuals", 
      x= "Decile of Wealth (by State)") + 
     theme(axis.text.x= element_text(angle= 90)) 
    } 
    }) 

    # generate a plot of home value of members' properties 
    output$plot_home_value <- reactivePlot(function() { 
    # call to update age factor if needed 
    updateAge_f() 

    if (input$factor_age == TRUE) { 
     ggplot(demos2, aes(home_value)) + geom_bar() + 
     facet_wrap(~ age_f, ncol= 3) + theme_bw() + 
     labs(title= "Home Value by Age Bracket", 
      y= "Count of Individuals", 
      x= "Home Value") + 
     theme(axis.text.x= element_text(angle= 90)) 
    } else if (input$factor_age == FALSE) { 
     ggplot(demos2, aes(home_value)) + geom_bar() + 
     theme_bw() + 
     labs(title= "Home Value of your Members", 
      y= "Count of Individuals", 
      x= "Home Value") + 
     theme(axis.text.x= element_text(angle= 90)) 
    } 
    }) 

    # generate a plot of education distribution 
    output$plot_edu <- reactivePlot(function() { 
    # call to update age factor if needed 
    updateAge_f() 

    if (input$factor_age == TRUE) { 
     ggplot(demos2, aes(ed_code)) + geom_bar() + 
     facet_wrap(~ age_f, ncol= 3) + theme_bw() + 
     labs(title= "Education Level by Age Bracket", 
      y= "Count of Individuals", 
      x= "Education Level") + 
     theme(axis.text.x= element_text(angle= 90)) 
    } else if (input$factor_age == FALSE) { 
     ggplot(demos2, aes(ed_code)) + geom_bar() + 
     theme_bw() + 
     labs(title= "Education Level of your Members", 
      y= "Count of Individuals", 
      x= "Education Level") + 
     theme(axis.text.x= element_text(angle= 90)) 
    } 
    }) 

    # generate a plot of members' estimated income levels 
    output$plot_inc <- reactivePlot(function() { 
    # call to update age factor if needed 
    updateAge_f() 

    if (input$factor_age == TRUE) { 
     ggplot(demos2, aes(inc)) + geom_bar() + 
     facet_wrap(~ age_f, ncol= 3) + theme_bw() + 
     labs(title= "Estimated Income by Age Bracket", 
      y= "Count of Individuals", 
      x= "Estimated Income Range") + 
     theme(axis.text.x= element_text(angle= 90)) 
    } else if (input$factor_age == FALSE) { 
     ggplot(demos2, aes(inc)) + geom_bar() + 
     theme_bw() + 
     labs(title= "Estimated Income of your Members", 
      y= "Count of Individuals", 
      x= "Estimated Income Range") + 
     theme(axis.text.x= element_text(angle= 90)) 
    } 
    }) 

    # generate a plot of members' homeownership 
    output$plot_h_own <- reactivePlot(function() { 
    # call to update age factor if needed 
    updateAge_f() 

    if (input$factor_age == TRUE) { 
     ggplot(demos2, aes(homeOwner)) + geom_bar() + 
     facet_wrap(~ age_f, ncol= 3) + theme_bw() + 
     labs(title= "Home Ownership by Age Bracket", 
      y= "Count of Individuals", 
      x= "Home Owner/Renter") + 
     theme(axis.text.x= element_text(angle= 90)) 
    } else if (input$factor_age == FALSE) { 
     ggplot(demos2, aes(homeOwner)) + geom_bar() + 
     theme_bw() + 
     labs(title= "Home Ownership of your Members", 
      y= "Count of Individuals", 
      x= "Home Owner/Renter") + 
     theme(axis.text.x= element_text(angle= 90)) 
    } 
    }) 
}) 

任何幫助將不勝感激,仍然試圖學習閃亮(如ev其他人)。

+0

「#...更多要遵循...」是否意味着您沒有向我們展示更多的代碼? – GSee

+0

不,這意味着我計劃編寫更多的代碼 –

+0

我看到的這個看起來令人懷疑的唯一的事情是,您在sliderInput()中傳遞一個單一數字以便進行賦值,特別是當它是一個範圍時,重新假設使用c(底部,頂部) –

回答

22

在ui.R,你不應該有一個逗號在此行的末尾:

sliderInput("age_cut", "Select Size of Age Brackets:", 
      min= 3, max= 20, value= 5), 

還有不應該在此行

checkboxInput(inputId = "h_own",  label = "Homeownership",   value = FALSE), 

結束一個逗號一般來說,在一個部分的最後一個部分後面不應該有逗號。就像使用任何R函數一樣,通常不會用逗號結束函數調用。例如sum(5,)提供了一個錯誤。

+3

謝謝--- ...語法錯誤... –

+10

這些錯誤是痛苦的,煩人的,並且無法跟蹤。實際上非常令人沮喪,因爲traceback()沒有引用你實際工作的代碼。 –