R 没有提供错误行号时如何调试?

R 没有提供错误行号时如何调试?,r,shiny,shinydashboard,shinyapps,R,Shiny,Shinydashboard,Shinyapps,我正在使用shiny和shinydashboard创建仪表板。最低示例代码如下所示: library(shiny) library(shinydashboard) ui <- dashboardPage( dashboardHeader(title = "test"), dashboardSidebar( sidebarMenu( menuItem(text = "Tab One",tabName = "tab1"),

我正在使用
shiny
shinydashboard
创建仪表板。最低示例代码如下所示:

library(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)
我知道我犯了这个错误,因为第10行末尾有一个额外的逗号。但问题是:

我的应用程序中也有类似的错误,但该应用程序包含20多个不同的R文件和2000多行代码。我不可能检查每个文件,并试图找出我在哪里加了一个逗号

我的问题是:

有没有更简单的方法让R打印带有行号和文件源的错误消息?或者,在没有提供详细信息的情况下,有没有更好的方法来调试此类错误?谢谢


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

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!
                       ^
源代码中出现错误:/9:10:缺少参数,没有默认值 9:menuItem(text=“Tab二”,tabName=“tab2”), 10:id=“sidebar”),#这里多了一个逗号! ^
源文件而不是运行主文件,并在错误发生后运行

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行是对
仪表板页面的重要调用。除非您将代码分解成更小的表达式,否则您不会得到比这更详细的细节。这会让人觉得很不自然,希望没有必要,但你可以把原文写成

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)
这告诉了我问题的来源

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

options(error = recover)
在采购所有东西之前。运行结束时将显示类似于
traceback()
display的内容,但格式不同。它还允许您检查每个计算框架中的变量,这在本例中可能没有帮助,但有时非常有用。

您可以使用
source()

(例如,我修改了您的代码,将带有错误的ui放入一个额外的文件
uiFile.R

然后激活回溯(请参见图片右侧:
显示回溯

然后你会看到:

它不是最优的,因为它没有显示第10行,但您至少可以单击蓝色突出显示的输出并导航到错误


有关如何调试闪亮应用程序的更多技术,此页面非常有用:。

使用
源代码
回溯
非常有效。!我将来肯定会使用此技术。非常感谢,你真的救了我一天!
选项(错误=恢复)
没有任何帮助。事实上,现在我被应用程序卡住了,在出现错误后无法轻松退出。我们如何将选项还原为默认值。令人惊讶的是,似乎找不到选项的参数(错误)列表。源代码的解决方案对我也没有任何帮助。我做了:
source(“ui.R”);source(“server.R”)
@LazarusThurston:有关
选项(“错误”)
的选项讨论,请参见
?选项
。默认设置为“未设置”,您可以返回使用
选项(错误=NULL)
。非常感谢!我还查看了您链接的文章,非常有用。
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)