Entrée de données via shinyTable dans l'application R shiny
je veux construire une application brillante qui obtient des données de matrice comme entrée et renvoie une table basée sur certaines opérations comme sortie. Par recherche, je trouve que le paquet ShinyTable pourrait être utile. J'ai essayé ci-dessous codes brillants, mais le résultat app apparaît gris et sans résultat.
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
)
}
))
Une Idée?
4 réponses
shinyTable
le paquet a été grandement améliorée dans le rhandsontable
paquet.
Ici est minimale, fonction qui prend un bloc de données et exécute une brillante application permettant de le modifier et l'enregistrer dans un rds
fichier:
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())
}
par exemple, prenez la base de données suivante:
> ( 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
Exécuter l'application et amusez-vous bien (surtout avec les calendriers ^^):
éditer le handsontable:
Cliquez sur le Save bouton. Il enregistre le tableau dans le fichier table.rds
. Alors lisez-le dans 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
si vous cherchez une solution pour que les utilisateurs puissent entrer leurs données matricielles comme dans excel, vous pouvez probablement jeter un oeil au paquet "shinySky" et plus spécifiquement à son composant "Handsontable Input/Output". Le web à l'adresse: https://github.com/AnalytixWare/ShinySky.
une autre solution similaire serait le paquet shinyTable. Vous pouvez trouver plus d'informations sur https://github.com/trestletech/shinyTable
je ne sais pas si ce qui suit est ce que vous cherchez, mais voilà. En supposant que vous pouvez entrer la matrice comme un fichier texte/csv, alors la modification suivante à votre code ci-dessus fonctionnerait. C'est directement à partir de la Brillante tutoriel: 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)
})
}
))
Vous pouvez utiliser hotable("matrixTable")
shinysky
Paquet.
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
)
Dans l'interface utilisateur ui
entrée "matrixTable"
et "resultTable"
sont visualisés. server
initialise ces tables, de sorte que matrixTable
peut être modifié. Cela signifie que vous pouvez copier & coller vos données à partir D'Excel, ou changer les valeurs manuellement. observe
fonction est activée, chaque fois qu'un changement est constaté dans l'entrée matrixTable
. Nous avons extrait un bloc de données df
ho.to.df
de cette table. Dans le cas où ses pas NULL
nous le convertissons dans une matrice, et appliquons quelques opérations matricielles (par exemple, carré chaque élément) et retournons la sortie comme une nouvelle matrice.
Cette solution a été obtenue en utilisant la suggestion de Christo et L'approche de Stéphane.