我有一个复杂的Shiny应用程序,分布在多个文件中,使用来自多个软件包的代码。该应用程序在R Studio中本地运行时有效,但在我的服务器上它会抛出一般错误:
错误:不知道如何转换' x'上课"日期"
这可能是一个简单的编程错误,但确切地说明 错误在代码中的位置证明是困难的。
我怎样才能找到并修复Shiny应用中的错误来源?有哪些工具可以系统地完成这项工作?
Google Groups对类似问题进行了一些讨论。
答案 0 :(得分:46)
您可以使用logging
和shinyjs
的组合来实现服务器上的日志记录。
install.packages("logging")
install.packages("shinyjs")
在您的ui.R中,使用shinyjs
绑定shinyjs::useShinyjs
:
library(shinyjs)
shinyUI(
fluidPage(
useShinyjs(),
# etc...
在您的server.R中,将logjs
添加到日志处理程序列表中:
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
。
其他提示
在本地运行您的应用时,例如从RStudio运行您的应用,请使用options(shiny.error = browser)
或options(shiny.error = recover)
来确定错误来源。
尽可能多地将业务逻辑放入包和外部脚本中。每当您怀疑它们导致问题时,对这些进行单元测试。 testthat
包可以在这里提供帮助。
如果您希望变量满足某些约束,请添加一个断言。例如,如果x
应为zoo
,请将assert_that(is.zoo(x))
置于被动反应的顶部附近。
请注意默认的drop
行为。养成每当您希望结果为drop = F
时指定data.frame
的习惯。
尽量减少代码单元所依赖的变量(选项,环境,缓存,UI状态等)的数量。弱类型语言已经足够难以调试了!
尽可能使用适当的S4和S3类而不是原始R结构。
dput
将允许您检查对象的内部结构,并且在尝试重现应用程序之外的错误时非常有用。
尝试在交互式控制台中进行调试,而不是在应用内使用print
。这将允许您更快地迭代。在无法在应用程序外部进行调试时,请尝试在问题代码之前进行browser()
调用。
从不在非交互式代码中使用sapply
。如果输出为空,则无法推断出您想要的类型并返回空list
。如果您的结果应为vector
,请使用vapply
。如果您的结果应为list
,请使用lapply
。
您还应该从RStudio团队查看Debugging Shiny Applications。
答案 1 :(得分:9)
我很惊讶没有提到the RStudio Shiny debug article。那篇文章在调试和错误处理方面非常彻底。
您可以查看服务器的日志,这可以更直接地解决OP提出的问题。
答案 2 :(得分:3)
日期问题: 服务器端可以使用不同的操作系统,具有不同的默认字符集编码(例如&#34; latin1&#34;,&#34; utf-8&#34;)。有时,在R中加载数据会丢失编码。 read.csv函数有一个参数encoding =&#34; UTF-8&#34 ;,你可以使用它。
要进行调试,我依赖于print语句。我也有兴趣知道其他人是否找到了更系统的方法。