2017-09-18 2 views
1

Je travaille depuis quelques jours avec Handsontable dans Shiny et je me suis coincé dans ce que je suppose sera une question très bête mais je n'ai pas beaucoup d'idée comment résoudre.Rechercher d'un texteEntrez à un Handsontable en Shiny

J'ai un Handsontable qui a une fonction personnalisée qui permet la recherche et cela fonctionne. Cela fonctionne mais n'est pas assez intuitif parce que vous devez cliquer avec le bouton droit sur la table pour faire apparaître l'option de recherche. Pour cette raison, j'ai décidé que je voudrais avoir un textInput qui fait la même fonction mais d'une manière plus jolie. Je sais que cela devrait être lié à un observEvent de la variable d'entrée (input $ searchId) mais je n'ai aucune idée de la façon de le faire en raison de mon manque d'expérience avec Shiny et Handsontable.

Ceci est le code du serveur.R qui imprime la table et qui a une fonction personnalisée qui permet à l'utilisateur de rechercher.

output$hot <-renderRHandsontable({rhandsontable(Dataset(),height = 600)%>% 
hot_table(columnSorting = TRUE,highlightCol = TRUE, highlightRow = TRUE, search = TRUE) %>% 
hot_context_menu(
    customOpts = list(
    search = list(name = "Search", 
        callback = htmlwidgets::JS(
        "function (key, options) { 
        var aux = document.getElementById('searchId').value; 
        var srch = prompt(Search); 

        this.search.query(srch); 
        this.render(); 
        }")))) }) 

Et ce que je voudrais est d'archiver le même résultat mais sans avoir à un clic droit sur la table et créer une invite.

Merci beaucoup,

Répondre

0

Eh bien, j'ai pu résoudre mon problème. Je suis inspiré par this post puis je suis arrivé avec quelque chose comme:

js_search <- " 
$(document).ready(setTimeout(function() { 
    document.getElementById('searchId').onchange = function(e){ 
    var hot_instance = HTMLWidgets.getInstance(hot).hot 
    console.log('hola') 
    var aux = document.getElementById('searchId').value; 
    hot_instance.search.query(aux); 
    hot_instance.render(); 
    } 
})) 
" 

qui doit être inclus dans votre ui.R avec un tags$head(tags$script(HTML(js_search)))

C'est tout le problème que je faisais est que je ahd aucune idée de comment obtenir le "ceci" de l'opération personnalisée dans le côté du serveur que j'avais avant. Une fois que vous savez que c'est hot_instance. où chaud est le nom de ma table, je pense que c'est facile.