[Shiny] Tables éditables avec rhandsontable

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Fred Santos
Messages : 233
Enregistré le : 11 Avr 2009, 10:00
Contact :

[Shiny] Tables éditables avec rhandsontable

Messagepar Fred Santos » 05 Sep 2017, 12:58

Bonjour,

Dans une interface shiny, je souhaiterais que l'utilisateur puisse éditer (en fait, remplir) directement une matrice ; matrice d'une dimension que l'utilisateur définit lui-même. Ensuite, cette matrice serait utilisée pour différents calculs.

J'ai trouvé le package rhandsontable qui semble permettre d'afficher des tables que l'on peut éditer, mais je ne parviens pas à obtenir exactement ce que je veux. Voici le code :

Code : Tout sélectionner

library(rhandsontable)
library(shiny)


## ui.R :
ui <- fluidPage(

 titlePanel("rHandsontable"),
 sidebarLayout(
  sidebarPanel(
   numericInput("dim", "Dimension de la table", min=2, value=5, max=10) # dimension de la table 
  ),

  mainPanel(
   h3("La table à éditer :"),
   rHandsontableOutput("tabEdit"), # affichage de la table à éditer (vide)
   h3("On l'affiche (simule sa disponibilité pour d'autres calculs) :"),
   tableOutput("tabDisplay") # affichage de la table "définitive", une fois éditée
   # (simple vérif destinée à voir si la table sera bien utilisable dans des calculs)
  )
 )
)


## server.R :
server <- function(input, output, session) {
 mat <- reactive({
  tab <- matrix(NA, nrow=input$dim, ncol=input$dim)
  colnames(tab) <- paste("V", 1:input$dim)
  rownames(tab) <- paste("I", 1:input$dim)
  return(tab)
 })

 output$tabEdit <- renderRHandsontable({rhandsontable(mat(), readOnly=FALSE)})
   
 output$tabDisplay <- renderTable(mat())
}


## Lancer l'appli :
runApp(list(server=server, ui=ui))

Comme vous pouvez le voir en exécutant le code, la table s'affiche bien... mais n'est pas éditable, en dépit de l'argument readOnly=FALSE. Comment y remédier ?

De plus, je suppose fortement (même si du coup je n'ai pas de moyen de le vérifier) que même si cette table était éditable, on ne pourrait pas en récupérer ensuite son contenu aussi simplement que je l'ai fait, mais on va prendre les problèmes un par un :D

Merci pour votre aide !

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: [Shiny] Tables éditables avec rhandsontable

Messagepar Serge Rapenne » 05 Sep 2017, 15:51

Bonjour,

Voici un code qui fonctionne mais on perd l'aspect dynamique de la taille du tableau :

Code : Tout sélectionner

library(rhandsontable)
library(shiny)

## ui.R :
ui <- fluidPage(
 
  titlePanel("rHandsontable"),
  sidebarLayout(
    sidebarPanel(
      numericInput("dim", "Dimension de la table", min=2, value=5, max=10) # dimension de la table
    ),
   
    mainPanel(
      h3("La table à éditer :"),
      rHandsontableOutput("tabEdit"), # affichage de la table à éditer (vide)
      h3("On l'affiche (simule sa disponibilité pour d'autres calculs) :"),
      tableOutput("tabDisplay") # affichage de la table "définitive", une fois éditée
      # (simple vérif destinée à voir si la table sera bien utilisable dans des calculs)
    )
  )
)

## server.R :
server <- function(input, output, session) {
 
  dta <- reactive({
    if (is.null(input$tabEdit)) {
    tab <- matrix(NA_integer_, nrow=5, ncol=5)
    colnames(tab) <- paste("V", 1:5)
    rownames(tab) <- paste("I", 1:5)
    DF<-tab
     } else {
       DF <- hot_to_r(input$tabEdit)
     }   
    DF
  })
 
  output$tabEdit <- renderRHandsontable({
    DF <- dta()
    rhandsontable(DF,  selectCallback = TRUE)
  })
 
  output$tabDisplay <- renderTable(dta())
}

## Lancer l'appli :
runApp(list(server=server, ui=ui))

Il faut obligatoirement que le type des colonnes soient connus d'où l'utilisation du NA_integer_ (en supposant que l’utilisateur doivent saisir des entiers).
Tu souhaite faire des saisies sur des tableaux de taille dynamique et là ça pose un gros problème. Pour pouvoir lire les données dans le handsontable, il faut qu'il soit initialisé puis on lit les modifications dedans par le DF <- hot_to_r(input$tabEdit) et donc il n'est plus possible de le modifier

Je ne pense pas qu'il soit possible de faire ce que tu veux avec un environnement "reactive" mais ça doit être possible avec une reactiveValue mais là je dois y réfléchir plus longuement et je ferais ça chez moi.

Serge

Fred Santos
Messages : 233
Enregistré le : 11 Avr 2009, 10:00
Contact :

Re: [Shiny] Tables éditables avec rhandsontable

Messagepar Fred Santos » 05 Sep 2017, 19:13

Bonjour Serge,

Merci beaucoup pour cette première réponse : j'apprends déjà quelque chose de précieux ! Je n'avais pas bien saisi cet aspect de handsontable.

Pour l'aspect taille dynamique, c'est effectivement un point indispensable pour l'interface, mais qui complique assez sérieusement les choses. Je ne sais pas si ça peut aider, mais ça ne me dérangerait pas du tout d'avoir un action button (ou de ne pas avoir un truc complètement réactif, si jamais c'est plus facile comme ça). Je n'ai pas l'impression que ça rende le truc plus facile, mais sait-on jamais...

En tout cas, re-merci !

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: [Shiny] Tables éditables avec rhandsontable

Messagepar Serge Rapenne » 13 Sep 2017, 14:39

Bonjour,

j'ai manqué de temps pour reprendre ton problème plus tôt.

Voici une solution qui fonctionne sous réserve que les entrées soient toutes entières (le "server.R", le "ui.R" est inchangé)

Code : Tout sélectionner

## server.R :
server <- function(input, output, session) {
 
 DF<-reactiveValues(mat=NULL)
 
  observe({
      if (!is.null(input$tabEdit))
        DF$mat <- hot_to_r(input$tabEdit)
  })
 
  observe({
    nb<-input$dim
    tab <- matrix(NA_integer_, nrow=nb, ncol=nb)
    colnames(tab) <- paste("V", 1:nb)
    rownames(tab) <- paste("I", 1:nb)
    DF$mat<-tab
  })
 
  output$tabEdit <- renderRHandsontable({
    DF <- DF$mat
    rhandsontable(DF,  selectCallback = TRUE)
  })
 
  output$tabDisplay <- renderTable(DF$mat)
}

si tu dois saisir des real, il faut remplacer NA_integer_ par NA_real_ dans le second "observe".

Serge

Fred Santos
Messages : 233
Enregistré le : 11 Avr 2009, 10:00
Contact :

Re: [Shiny] Tables éditables avec rhandsontable

Messagepar Fred Santos » 14 Sep 2017, 11:42

Rebonjour Serge,
Formidable, merci beaucoup ! Je ne comprends pas encore tout (je n'avais encore jamais utilisé / jamais eu besoin de reactiveValues jusqu'ici), mais je vais potasser tout ça.
Encore merci pour ta disponibilité !

Stéphane Laurent
Messages : 1557
Enregistré le : 05 Déc 2006, 19:07

Re: [Shiny] Tables éditables avec rhandsontable

Messagepar Stéphane Laurent » 17 Sep 2017, 14:41

J'ai ça sur mon blog si ça peut aider : http://stla.github.io/stlapblog/posts/shiny_editTable.html

Perso je n'utilise plus rhandsontable, maintenant j'utilise directement la librairie Javascript.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité