闪亮的 ui.R - 标签中的错误(“div”,列表(...)) - 不确定错误在哪里

Posted

技术标签:

【中文标题】闪亮的 ui.R - 标签中的错误(“div”,列表(...)) - 不确定错误在哪里【英文标题】:Shiny ui.R - Error in tag("div", list(...)) - not sure where error is 【发布时间】:2012-12-03 21:51:18 【问题描述】:

更新 - 2012 年 12 月 17 日上午 9 点 CDT:示例已更新,包含演示数据和完整代码。 [/update]。

示例数据: https://gist.github.com/4318774

说明: 我一直在玩新的 Shiny 包(喜欢它!)但还不明白我在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))
    
  )
)

任何帮助将不胜感激,仍在努力学习闪亮(像其他人一样)。

【问题讨论】:

“# ... more to follow...”是否意味着您没有向我们展示更多代码? 不,这意味着我打算写更多的代码 我看到的唯一一件令人怀疑的事情是您将单个数字传递给sliderInput()中的值,当,特别是如果它是一个范围时,您应该使用c(底部,顶部) @BrandonBertelsen - 您可以执行单个值或 c(top, bottom)。 http://rstudio.github.com/shiny/tutorial/#sliders 【参考方案1】:

在 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,) 报错。

【讨论】:

这些错误令人痛苦、烦人且无法追踪。实际上很令人沮丧,因为 traceback() 没有引用您实际使用的代码。 在 RStudio 本地开发期间应用程序运行良好时也很难追踪,但通过 Shiny Server 运行时会引发错误。 :facepalm:

以上是关于闪亮的 ui.R - 标签中的错误(“div”,列表(...)) - 不确定错误在哪里的主要内容,如果未能解决你的问题,请参考以下文章

表格列的R闪亮鼠标悬停文本

R 闪亮 - 图像不出现

R 用 updateSelectInput 反应闪亮

如何安排闪亮的模块文件,以便它们在闪亮的服务器上运行?

闪亮的网站图标

如何在闪亮的应用程序中用颜色画线