未提供错误行号时如何调试?

时间:2019-05-03 19:19:42

标签: r shiny shinydashboard shinyapps

我正在使用shinydashboardlibrary(shiny) library(shinydashboard) ui <- dashboardPage( dashboardHeader(title = "test"), dashboardSidebar( sidebarMenu( menuItem(text = "Tab One",tabName = "tab1"), menuItem(text = "Tab Two",tabName = "tab2"), id = "sidebar"), # an extra comma here! ), dashboardBody() ) server <- function(input,output){} shinyApp(ui,server) 创建仪表板。最少的示例代码如下:

Error in tag("section", list(...)) : argument is missing, with no default

运行此应用程序时,出现错误消息:

Error in source: <folder>/<file.R> 9:10: argument is missing, with no default
9:      menuItem(text = "Tab Two",tabName = "tab2"),
10:     id = "sidebar"), # an extra comma here!
                       ^

我知道我收到此错误是因为在第10行的末尾有一个逗号。但是问题是:

我的应用程序中出现类似的错误,但是该应用程序包含20多个相互采购的R文件以及2000多个代码行。对我来说,遍历每个文件并尝试找出多余的逗号是不可能的。

我的问题是:

有没有更简单的方法让R用行号和文件源打印错误消息?还是有一种更好的方法来调试这种错误(没有提供详细信息)?谢谢!


理想情况下,我希望错误消息类似于以下内容:

{{1}}

2 个答案:

答案 0 :(得分:2)

获取主文件而不是运行它,并在错误发生后运行

traceback()
在控制台中

。当我通过您的简单示例进行操作时,会看到以下内容:

> traceback()
11: tag("section", list(...))
10: tags$section(id = "sidebarItemExpanded", class = "sidebar", `data-disable` = if (disable) 1 else NULL, 
        list(...))
9: tag("aside", list(...))
8: tags$aside(id = "sidebarCollapsed", class = "main-sidebar", `data-collapsed` = dataValueString, 
       custom_css, tags$section(id = "sidebarItemExpanded", class = "sidebar", 
           `data-disable` = if (disable) 1 else NULL, list(...)))
7: dashboardSidebar(sidebarMenu(menuItem(text = "Tab One", tabName = "tab1"), 
       menuItem(text = "Tab Two", tabName = "tab2"), id = "sidebar"), 
       )
6: tagAssert(sidebar, type = "aside", class = "main-sidebar")
5: dashboardPage(dashboardHeader(title = "test"), dashboardSidebar(sidebarMenu(menuItem(text = "Tab One", 
       tabName = "tab1"), menuItem(text = "Tab Two", tabName = "tab2"), 
       id = "sidebar"), ), dashboardBody()) at .active-rstudio-document#4
4: eval(ei, envir)
3: eval(ei, envir)
2: withVisible(eval(ei, envir))
1: source("~/.active-rstudio-document", echo = TRUE)

请注意,标记为5:的表达式具有行号信息:.active-rstudio-document#4。那是RStudio在采购之前保存的文件,#4部分说问题出在第4行。第4行是对dashboardPage的大呼声。除非将代码分解成更小的表达式,否则您将没有比这更详细的细节。这会感觉很不自然,希望没有必要,但是您可以将原始文字写为

library(shiny)
library(shinydashboard)

header <- dashboardHeader(title = "test")
sidebar <- dashboardSidebar(
  sidebarMenu(
    menuItem(text = "Tab One",tabName = "tab1"),
    menuItem(text = "Tab Two",tabName = "tab2"),
    id = "sidebar"), # an extra comma here!
)
body <- dashboardBody()
ui <- dashboardPage(
  header,
  sidebar,
  body
)

server <- function(input,output){}

shinyApp(ui,server)

当我这样做时,traceback()包括以下行:

5: dashboardSidebar(sidebarMenu(menuItem(text = "Tab One", tabName = "tab1"), 
       menuItem(text = "Tab Two", tabName = "tab2"), id = "sidebar"), 
       ) at .active-rstudio-document#5

告诉我问题出在哪里

编辑后添加:查看回溯的另一种方法是运行

options(error = recover)

在采购所有东西之前。运行将以traceback()显示屏之类的显示屏终止,但格式不同。它还可以让您检查每个评估框架中的变量,这在本示例中可能无济于事,但有时会很有帮助。

答案 1 :(得分:2)

您可以改用source()

(例如,我通过将带有错误的ui放入额外的文件uiFile.R中来修改您的代码。

enter image description here

,然后激活回溯(请参见图片的右侧:Show Traceback)。

然后您将看到:

enter image description here

这不是最佳选择,因为它不会显示第10行,但您至少可以单击突出显示的蓝色输出并找到错误。

有关如何调试闪亮应用程序的更多技术,此页面非常有用:https://shiny.rstudio.com/articles/debugging.html