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