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?

18
demandé sur Mahmoud 2014-03-08 21:27:18

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 ^^):

enter image description here

éditer le handsontable:

enter image description here

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
15
répondu Stéphane Laurent 2016-08-15 07:40:00

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

6
répondu Christos 2014-09-19 07:31:33

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)
        })
    }
))

enter image description here

2
répondu harkmug 2014-03-10 21:53:03

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

2
répondu Wolfi 2017-01-13 18:52:23