web-dev-qa-db-fra.com

Obtenir la ligne sélectionnée de DataTable dans une application brillante

Je veux modifier cette application:

https://demo.shinyapps.io/029-row-selection/

de sorte qu'une seule ligne puisse être sélectionnée à la fois et que je puisse acquérir l'élément de la première colonne de la ligne sélectionnée pour tracer des données. Est-ce que quelqu'un sait comment faire ça?

18
evolvedmicrobe

UPDATE: vous pouvez maintenant accéder aux lignes sélectionnées en utilisant input$tableId_rows_selected dans server.R. Voir ici pour plus de détails.

Pour sélectionner une ligne unique, vous pouvez modifier la fonction de rappel de votre exemple comme suit:

callback = "function(table) {
      table.on('click.dt', 'tr', function() {
            table.$('tr.selected').removeClass('selected');
            $(this).toggleClass('selected');            
        Shiny.onInputChange('rows',
                            table.rows('.selected').data()[0][0]);
      });
    }"

Lorsque vous cliquez sur une ligne, toutes les lignes sélectionnées sont supprimées (elles ont la classe .selected) et la ligne sélectionnée est sélectionnée.

J'ai également changé le code dans la fonction Shiny.onInputChange afin qu'il renvoie le nombre dans la première colonne.

19
NicE

La méthode R qui rend un DataTable a un paramètre qui définit le mode de sélection. Par exemple:

output$table1 <-
  DT::renderDataTable(dataSet,
                      selection = 'single')

Les valeurs possibles sont ("multiple" par défaut):

  • none
  • unique
  • plusieurs

Pour plus de référence, vous pouvez consulter: http://rstudio.github.io/DT/shiny.html

EDIT le 14/04/2016

Dans la configuration que j'utilise, le mode de sélection unique a des problèmes.

Voici quelle version j'utilise:

> DT:::DataTablesVersion
[1] "1.10.7"
> packageVersion("DT")
[1] ‘0.1’

Le problème que j'ai rencontré est que visuellement vous avez une sélection à une seule ligne mais quand vous faites:

observeEvent(input$table1_rows_selected, {
  str(input$table1_rows_selected)
})

Vous obtiendrez une liste avec toutes les lignes sélectionnées mais non désélectionnées explicitement. En d'autres termes, la sélection d'une nouvelle ligne ne désélectionne pas automatiquement la ligne précédente dans la logique Datatables interne. Cela peut également être dû à l'encapsuleur DT, pas sûr.

C’est la raison pour laquelle nous utilisons actuellement JS comme solution de contournement:

$(document).on('click', '#table1 table tr', function() {
    var selectedRowIds = $('#table1 .dataTables_scrollBody table.dataTable').DataTable().rows('.selected')[0];

    var selectedId = "";
    if (selectedRowIds.length === 1) {
        selectedId = $(this).children('td:eq(0)').text();
    } else {
      $('#table1 tbody tr').removeClass('selected');
    }
    Shiny.onInputChange("table1_selected_id", selectedId);
});

Une fois que vous avez cela en place, vous pourrez faire:

observeEvent(input$table1_selected_id, {
  str(input$table1_selected_id)
})

Cela envoie maintenant au moins des données correctes à votre code server.R. Malheureusement, vous rencontrez toujours un problème avec la table car en interne, celle-ci garde en trace les lignes sélectionnées et si vous changez de page, une mauvaise sélection sera restaurée. Mais au moins, ceci est purement un défaut visuel et votre code aura la chance de fonctionner correctement. Cette solution nécessite donc plus de travail.

12
Angel Naydenov

Ce n'est pas une solution directe à l'exemple que vous avez posté, mais donne une réponse avec un autre exemple. 

Il existe un exemple d'application téléchargeable fourni et décrit dans le lien suivant, cliquez ici ! pour sélectionner une seule ligne dans une table en utilisant un paramètre de classe. 

1
Manohar Swamynathan