tutorial style examples español r debugging shiny

style - shiny tutorial español



Depuración efectiva de aplicaciones Shiny (3)

Tengo una aplicación compleja de Shiny distribuida en varios archivos que utiliza código de varios paquetes. La aplicación funciona cuando se ejecuta localmente en R Studio, pero en mi servidor produce un error genérico:

Error: no sé cómo convertir ''x'' a la clase "Fecha"

Probablemente sea un error de programación simple, pero resulta difícil determinar exactamente dónde se encuentra ese error en el código.

¿Cómo puedo buscar y corregir la fuente de errores en las aplicaciones Shiny? ¿Y qué herramientas están disponibles para hacer esto de manera sistemática?

Ha habido alguna discusión sobre problemas similares en los Grupos de Google .


Fecha de emisión: el lado del servidor podría estar usando un sistema operativo diferente, con una codificación de juego de caracteres predeterminada diferente (por ejemplo, "latin1", "utf-8"). A veces, la carga de datos en R pierde la codificación. La función read.csv tiene un parámetro encoding = "UTF-8", que puede usar.

Para depurar, me he basado en declaraciones impresas. También me interesa saber si otros han encontrado una forma más sistemática.


Me sorprende que el artículo de depuración de RStudio Shiny no se mencione. Ese artículo es muy completo en el procesamiento de errores y depuración.

Puede consultar el registro de su servidor, que debería resolver la pregunta formulada por OP más directamente.


Puede lograr el registro en el servidor usando una combinación de logging y shinyjs .

install.packages("logging") install.packages("shinyjs")

En tu ui.R, vincula shinyjs usando shinyjs::useShinyjs :

library(shinyjs) shinyUI( fluidPage( useShinyjs(), # etc...

En su server.R, agregue logjs a la lista de manejadores de registro:

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...

Luego, para imprimir algo, usa loginfo .

Otros consejos

  1. Cuando ejecute su aplicación localmente, como desde RStudio, use las options(shiny.error = browser) u options(shiny.error = recover) para identificar la fuente de los errores.

  2. Ponga tanta lógica empresarial en paquetes y scripts externos como sea posible. Haga una prueba de unidad siempre que sospeche que están causando problemas. El paquete testthat puede ayudar aquí.

  3. Si espera que una variable cumpla ciertas restricciones, agregue una aserción. Por ejemplo, si x debería ser un zoo , coloque assert_that(is.zoo(x)) cerca de la parte superior de su reactivo.

  4. Tenga cuidado con el comportamiento predeterminado de drop . Adquiera el hábito de especificar drop = F cuando desee que su resultado sea un data.frame .

  5. Intente minimizar el número de variables (opciones, entorno, almacenamiento en caché, estado de IU, etc.) de las que depende una unidad de código. ¡Los lenguajes débilmente escritos ya son lo suficientemente difíciles de depurar!

  6. Use las clases adecuadas de S4 y S3 en lugar de estructuras R en bruto siempre que sea posible.

  7. dput te permitirá examinar la estructura interna de los objetos, y es muy útil cuando intentas reproducir errores fuera de una aplicación.

  8. Intente realizar la depuración en una consola interactiva, sin utilizar print dentro de una aplicación. Esto te permitirá iterar más rápidamente. Cuando no es posible realizar una depuración fuera de una aplicación, intente hacer una llamada al browser() justo antes del código de problema.

  9. Nunca utilice sapply en código no interactivo. Con una salida vacía, no podrá inferir el tipo que desea y devolver una list vacía. Si su resultado debe ser un vector , use vapply . Si su resultado debe ser una list , use lapply .

También deberías ver Debugging Shiny Applications del equipo de RStudio.