我有一个复杂的shiny 应用程序,它分布在多个文件中,使用多个包中的代码.在R Studio中本地运行时,该应用程序可以工作,但在我的服务器上,它会引发一个一般性错误:
错误:不知道如何将"x"转换为类"日期"
这可能是一个简单的编程错误,但要准确地找出代码中的错误是很困难的.
如何查找和修复shiny 应用程序中的错误源?有哪些工具可以系统地做到这一点?
关于类似的问题,在Google Groups上也有一些讨论.
我有一个复杂的shiny 应用程序,它分布在多个文件中,使用多个包中的代码.在R Studio中本地运行时,该应用程序可以工作,但在我的服务器上,它会引发一个一般性错误:
错误:不知道如何将"x"转换为类"日期"
这可能是一个简单的编程错误,但要准确地找出代码中的错误是很困难的.
如何查找和修复shiny 应用程序中的错误源?有哪些工具可以系统地做到这一点?
关于类似的问题,在Google Groups上也有一些讨论.
您可以使用logging
和shinyjs
的组合在服务器上实现登录.
install.packages("logging")
install.packages("shinyjs")
在你的ui中.R、 使用shinyjs::useShinyjs
绑定shinyjs
:
library(shinyjs)
shinyUI(
fluidPage(
useShinyjs(),
# etc...
在你的服务器上.R、 将logjs
添加到日志(log)处理程序列表中:
library(magrittr)
library(shinyjs)
library(logging)
basicConfig()
options(shiny.error = function() {
logging::logerror(sys.calls() %>% as.character %>% paste(collapse = ", ")) })
shinyServer(function(input, output, session) {
printLogJs <- function(x, ...) {
logjs(x)
T
}
addHandler(printLogJs)
# etc...
然后用loginfo
打印一些东西.
Other Tips
在本地运行应用程序时(例如从RStudio运行),请使用options(shiny.error = browser)
或options(shiny.error = recover)
来识别错误源.
将尽可能多的业务逻辑放入包和外部脚本中.无论何时,只要你怀疑它们会引发问题,就对它们进行单元测试.testthat
美元的套餐在这里很有用.
如果希望变量满足某些约束,请添加断言.例如,如果x
应该是zoo
,那么把assert_that(is.zoo(x))
放在你的react 式表顶部附近.
小心默认的drop
行为.养成习惯,只要你想让结果变成data.frame
,就指定drop = F
.
尽量减少一个代码单元所依赖的变量(选项、环境、缓存、UI状态等)的数量.弱类型语言已经很难调试了!
尽可能使用适当的S4和S3类,而不是原始的R struct .
dput
将允许您判断对象的内部 struct ,并且在try 在应用程序之外重现错误时非常有用.
try 在交互式控制台中进行调试,而不是在应用程序中使用print
.这将允许您更快地迭代.如果无法在应用程序外部进行调试,请try 在问题代码之前拨打browser()
电话.
Never在非交互式代码中使用sapply
.如果输出为空,它将无法推断出所需的类型并返回空值.如果你的结果应该是vector
,使用vapply
.如果你的结果应该是list
,使用lapply
.
你还应该看看RStudio团队的Debugging Shiny Applications个.