tutorial renderdatatable examples español r shiny

renderdatatable - Entrada de datos a través de shinyTable en la aplicación R shiny



shiny dashboard examples (4)

Quiero crear una aplicación brillante que obtenga datos de matriz como entrada y devuelva una tabla basada en algunas operaciones como salida. Por búsqueda encuentro que el paquete ShinyTable podría ser útil. Intenté debajo de los códigos brillantes, pero la aplicación del resultado aparece en gris y sin resultado.

library(shinyTable) shiny::runApp(list( ui=pageWithSidebar( headerPanel(''Simple matrixInput'') , sidebarPanel( htable("tbl") , submitButton("OK") ) , mainPanel( tableOutput(outputId = ''table.output'') )) , server=function(input, output){ output$table.output <- renderTable({ input$tbl^2 } , sanitize.text.function = function(x) x ) } ))

¿Alguna idea?


El paquete shinyTable ha sido mejorado en gran medida en el paquete rhandsontable .

Aquí hay una función mínima que toma un marco de datos y ejecuta una aplicación brillante que permite editarlo y guardarlo en un archivo rds :

library(rhandsontable) library(shiny) editTable <- function(DF, outdir=getwd(), outfilename="table"){ ui <- shinyUI(fluidPage( titlePanel("Edit and save a table"), sidebarLayout( sidebarPanel( helpText("Shiny app based on an example given in the rhandsontable package.", "Right-click on the table to delete/insert rows.", "Double-click on a cell to edit"), wellPanel( h3("Table options"), radioButtons("useType", "Use Data Types", c("TRUE", "FALSE")) ), br(), wellPanel( h3("Save"), actionButton("save", "Save table") ) ), mainPanel( rHandsontableOutput("hot") ) ) )) server <- shinyServer(function(input, output) { values <- reactiveValues() ## Handsontable observe({ if (!is.null(input$hot)) { DF = hot_to_r(input$hot) } else { if (is.null(values[["DF"]])) DF <- DF else DF <- values[["DF"]] } values[["DF"]] <- DF }) output$hot <- renderRHandsontable({ DF <- values[["DF"]] if (!is.null(DF)) rhandsontable(DF, useTypes = as.logical(input$useType), stretchH = "all") }) ## Save observeEvent(input$save, { finalDF <- isolate(values[["DF"]]) saveRDS(finalDF, file=file.path(outdir, sprintf("%s.rds", outfilename))) }) }) ## run app runApp(list(ui=ui, server=server)) return(invisible()) }

Por ejemplo, tome el siguiente marco de datos:

> ( DF <- data.frame(Value = 1:10, Status = TRUE, Name = LETTERS[1:10], Date = seq(from = Sys.Date(), by = "days", length.out = 10), stringsAsFactors = FALSE) ) Value Status Name Date 1 1 TRUE A 2016-08-15 2 2 TRUE B 2016-08-16 3 3 TRUE C 2016-08-17 4 4 TRUE D 2016-08-18 5 5 TRUE E 2016-08-19 6 6 TRUE F 2016-08-20 7 7 TRUE G 2016-08-21 8 8 TRUE H 2016-08-22 9 9 TRUE I 2016-08-23 10 10 TRUE J 2016-08-24

Ejecuta la aplicación y diviértete (especialmente con los calendarios ^^):

Edite el handsontable :

Haga clic en el botón Guardar . Guarda la tabla en el archivo table.rds . Luego léelo en R:

> readRDS("table.rds") Value Status Name Date 1 1000 FALSE Mahmoud 2016-01-01 2 2000 FALSE B 2016-08-16 3 3 FALSE C 2016-08-17 4 4 TRUE D 2016-08-18 5 5 TRUE E 2016-08-19 6 6 TRUE F 2016-08-20 7 7 TRUE G 2016-08-21 8 8 TRUE H 2016-08-22 9 9 TRUE I 2016-08-23 10 10 TRUE J 2016-08-24


No estoy seguro de si lo siguiente es lo que está buscando, pero aquí va. Suponiendo que puede ingresar la matriz como un archivo de texto / csv, la siguiente modificación a su código anterior funcionará. Esto es directamente del tutorial de Shiny: http://rstudio.github.io/shiny/tutorial/#uploads

shiny::runApp(list( ui=pageWithSidebar( headerPanel(''Simple matrixInput'') , sidebarPanel( fileInput(''file1'', ''Choose CSV File'', accept=c(''text/csv'', ''text/comma-separated-values,text/plain'', ''.csv'')) , tags$hr(), checkboxInput(''header'', ''Header'', TRUE), radioButtons(''sep'', ''Separator'', c(Comma='','', Semicolon='';'', Tab=''/t''), ''Comma''), radioButtons(''quote'', ''Quote'', c(None='''', ''Double Quote''=''"'', ''Single Quote''="''"), ''Double Quote'') ) , mainPanel( tableOutput(outputId = ''table.output'') )) , server=function(input, output){ output$table.output <- renderTable({ inFile <- input$file1 if (is.null(inFile)) return(NULL) tbl <- read.csv(inFile$datapath, header=input$header, sep=input$sep, quote=input$quote) return(tbl^2) }) } ))


Puedes usar hotable("matrixTable") del paquete shinysky .

library(shiny, shinysky) shinyApp( ui = shinyUI (wellPanel(hotable("matrixTable"),hotable("resultTable"))), server = shinyServer (function(input, output) { A = matrix(c(1:6), nrow=2) # init - input matrix A output$matrixTable <- renderHotable({data.frame(A)}, readOnly = FALSE) R = matrix(rep(0,6), nrow=2) # init - result matrix R output$resultTable <- renderHotable({data.frame(R)}, readOnly = TRUE) observe({ # process matrix df <- hot.to.df(input$matrixTable) if(!is.null(df)) { # ensure data frame from table exists B = data.matrix(df) # ensure its numeric R = B^2 # some matrix operation output$resultTable <- renderHotable({data.frame(R)}) } }) # end of observe }) # end of server )

En la interfaz de usuario ui se visualizan las entradas "matrixTable" y "resultTable" . El server inicializa estas tablas, de manera que la matrixTable se puede editar. Eso significa que puede copiar y pegar sus datos desde Excel, o cambiar los valores manualmente. La función de observe se activa, siempre que se note un cambio en la matrixTable entrada. ho.to.df un cuadro de datos df con ho.to.df de esa tabla. En caso de que no sea NULL lo convertimos en una matriz, aplicamos algunas operaciones de matriz (por ejemplo, cuadramos cada elemento) y devolvemos la salida como una nueva matriz.

Esta solución se obtuvo utilizando la sugerencia de Christo y el enfoque de Stephane.


Si está buscando una solución para que los usuarios puedan ingresar sus datos matriciales como en Excel, probablemente podría echar un vistazo al paquete "shinySky" y más específicamente a su componente "Entrada / Salida de Manos a Mano". La dirección web correspondiente es: https://github.com/AnalytixWare/ShinySky .

Otra solución similar sería el paquete shinyTable. Puede encontrar más información en https://github.com/trestletech/shinyTable