Utilisation de Fuzzy Search et Shiny dans R : un guide complet
P粉924915787
P粉924915787 2024-04-01 14:09:01
0
1
489

J'essaie d'utiliser ce script JS dans une table de données DT (à partir de ce site : https://datatables.net/blog/2021-09-17) :

var fsrco = $('#fuzzy-ranking').DataTable({
    fuzzySearch: {
        rankColumn: 3
    },
    sort: [[3, 'desc']]
});
 
fsrco.on('draw', function(){
    fsrco.order([3, 'desc']);
});

Utilisez cette balise de script :

"//cdn.datatables.net/plug-ins/1.11.3/features/fuzzySearch/dataTables.fuzzySearch.js"

Je souhaite intégrer cela dans une fonction de table de données DT dans une application Shiny où la recherche floue est appliquée en utilisant l'ordre de classement (le haut a une similarité plus élevée), cependant, je ne veux pas que la colonne de classement soit affichée.

Similaire à ceci, mais sans la colonne de classement.

Quelques exemples généraux de base :

    library(shiny)
    library(DT)
    js <- c(
      "  var fsrco = $('#fuzzy-ranking').DataTable({",
      "    fuzzySearch: {",
      "        rankColumn: 3",
      "    },",
      "    sort: [[3, 'desc']]",
      "});",
      "fsrco.on('draw', function(){",
      "    fsrco.order([3, 'desc']);",
      "});"
)
    ui <- fluidPage(
      DTOutput("table")
    )
    server <- function(input, output, session){
      output[["table"]] <- renderDT({
        datatable(
          iris,
          selection = "none",
          editable = TRUE, 
          callback = JS(js),
          extensions = "KeyTable",
          options = list(
            keys = TRUE,
            url = "//cdn.datatables.net/plug-ins/1.11.3/features/fuzzySearch/dataTables.fuzzySearch.js"
          )
        )
      })
    }
    shinyApp(ui, server)

P粉924915787
P粉924915787

répondre à tous(1)
P粉310931198

Ce plugin est un ancien plugin et il ne fonctionne pas avec la dernière version de DataTables.

Mais nous pouvons prendre une fonction JavaScript qui calcule la similarité et l'utiliser dans une recherche personnalisée via l'extension SearchBuilder.

Tout d'abord, copiez ce code JavaScript et enregistrez-le sous le nom levenshtein.js :

/*
BSD 2-Clause License

Copyright (c) 2018, Tadeusz Łazurski
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

function levenshtein(__this, that, limit) {
  var thisLength = __this.length,
    thatLength = that.length,
    matrix = [];

  // If the limit is not defined it will be calculate from this and that args.
  limit = (limit || (thatLength > thisLength ? thatLength : thisLength)) + 1;

  for (var i = 0; i  (limit || 100)) {
    return prepare(limit || 100);
  }
  if (thisLength === 0) {
    return prepare(thatLength);
  }
  if (thatLength === 0) {
    return prepare(thisLength);
  }

  // Calculate matrix.
  var j, this_i, that_j, cost, min, t;
  for (i = 1; i  4) return prepare(thisLength);

      that_j = that[j - 1];
      cost = this_i === that_j ? 0 : 1; // Step 5
      // Calculate the minimum (much faster than Math.min(...)).
      min = matrix[i - 1][j] + 1; // Devarion.
      if ((t = matrix[i][j - 1] + 1)  1 &&
        j > 1 &&
        this_i === that[j - 2] &&
        __this[i - 2] === that_j &&
        (t = matrix[i - 2][j - 2] + cost) 

Maintenant, voici le code R :

library(DT)

dtable ').on('input', function() { fn(that, this) });",
              "  if (preDefined !== null) {",
              "     $(el).val(preDefined[0]);",
              "  }",
              "  return el;",
              "}"
            ),
            inputValue = JS(
              "function (el) {",
              "  return [$(el[0]).val()];",
              "}"
            ),
            isInputValid = JS(
              "function (el, that) {",
              "  return $(el[0]).val().length !== 0;",
              "}"
            ),
            search = JS(
              "function (value, pattern) {",
              "  var fuzzy = levenshtein(value, pattern[0]);",
              "  return fuzzy.similarity > 0.25;",
              "}"
            )
          )
        )
      )
    )
  )
)

path 

Le seuil de similarité doit être sélectionné. Ce que j'ai pris ici c'est 0.25 :

return fuzzy.similarity > 0.25;

Modifier

Pour utiliser Shiny, utilisez server=FALSE :

renderDT({
  dtable
}, server = FALSE)
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal