Comment créer TextArea en entrée dans une webapp brillante dans R?

J'essaie de créer une application web simple où je veux prendre une entrée multiligne de l'utilisateur en utilisant le contrôle HTML textarea. Existe-t-il un moyen de créer un tel contrôle d'entrée dans Shiny?

La page d'aide de textInput n'affiche pas beaucoup d'options

textInput {shiny}   R Documentation
Create a text input control

Description

Create an input control for entry of unstructured text values

Usage

  textInput(inputId, label, value = "")
Arguments

inputId 
Input variable to assign the control's value to

label   
Display label for the control

value   
Initial value

Value

A text input control that can be added to a UI definition.

Examples

textInput("caption", "Caption:", "Data Summary")
29
demandé sur Chinmay Patil 2013-01-22 09:59:43

6 réponses

Vous pouvez ajouter une zone de texte en utilisant tags et elle doit être automatiquement récupérée par Shiny:

tags$textarea(id="foo", rows=3, cols=40, "Default value")

Ou si vous êtes plus à L'aise avec le HTML droit, vous pouvez également faire

HTML('<textarea id="foo" rows="3" cols="40">Default value</textarea>')

Dans les deux cas, {[3] } devrait refléter la valeur de la zone de texte.

37
répondu Joe Cheng 2014-11-27 06:09:45

Pour le bénéfice des autres, je vais poster comment j'ai résolu le problème en utilisant le contrôle de L'interface utilisateur personnalisé suivant le tutoriel brillant

Tout d'abord, j'ai créé textarea.fichier js comme suit

$(document).on("click", "textarea.inputTextarea", function(evt) {

  // evt.target is the button that was clicked
  var el = $(evt.target);

  // Raise an event to signal that the value changed
  el.trigger("change");
});

var inputTextareaBinding = new Shiny.InputBinding();
$.extend(inputTextareaBinding, {
  find: function(scope) {
    return $(scope).find(".inputTextarea");
  },
  getValue: function(el) {
    return $(el).text();
  },
  setValue: function(el, value) {
    $(el).text(value);
  },
  subscribe: function(el, callback) {
    $(el).on("change.inputTextareaBinding", function(e) {
      callback();
    });
  },
  unsubscribe: function(el) {
    $(el).off(".inputTextareaBinding");
  }
});

Shiny.inputBindings.register(inputTextareaBinding);

Ensuite, j'ai ajouté la fonction suivante dans l'interface utilisateur.R de shiny webapp avant shinyUI () est appelé

inputTextarea <- function(inputId, value="", nrows, ncols) {
    tagList(
        singleton(tags$head(tags$script(src = "textarea.js"))),
        tags$textarea(id = inputId,
                    class = "inputtextarea",
                    rows = nrows,
                    cols = ncols,
                    as.character(value))
    )
}

Ensuite, j'ai utilisé la fonction définie ci-dessus pour créer l'élément de contrôle textarea souhaité dans l'interface utilisateur.R

shinyUI(pageWithSidebar(

  # Application title
  headerPanel("Test Header Panel"),

  sidebarPanel(),

  mainPanel(
        inputTextarea('exampleTextarea', '',20,35 )
  )
))
25
répondu Chinmay Patil 2013-01-25 01:10:43

Peut ou peut ne pas être pertinent ici, mais j'ai fait le paquetshinyAce pour envelopper et exposer L'éditeur de texte Ace dans Shiny. Ace est principalement utilisé pour l'édition de code (avec coloration syntaxique pour une variété de langues), mais fournit une interface de type zone de texte pour l'écriture de la composition de texte/code multi-ligne.

Vous pouvez découvrez l'exemple pour voir si cela pourrait être ce que vous cherchez. (Essayez différents "modes" pour la coloration syntaxique et les thèmes pour la couleur combinaison.)

15
répondu Jeff Allen 2013-10-14 14:01:13

À Partir de la version 0.14 brillant possède une mise en œuvre de textAreaInput.

4
répondu alko989 2016-11-07 14:55:21

Construire à partir de la réponse de Joe ( https://stackoverflow.com/a/14452837/5776618), Vous pouvez également imbriquer des balises dans votre propre fonction pour obtenir la même sortie que les fonctions d'entrée intégrées brillantes standard.

textareaInput <- function(id, label, value, rows=20, cols=35, class="form-control"){
  tags$div(
    class="form-group shiny-input-container",
    tags$label('for'=id,label),
    tags$textarea(id=id,class=class,rows=rows,cols=cols,value))
  }

C'est un moyen d'éviter d'écrire le code JS (si vous le souhaitez) tout en restant...

  • ayant une fonction qui appelle de la même manière que les entrées brillantes intégrées sont appelées, et
  • inclut le style CSS de contrôle de formulaire div, label et Bootstrap (de sorte qu'il ressemble aux commandes D'entrée brillantes intégrées)

L'utilisation de la fonction est la même que si vous utilisez le built-in ou si vous avez créé une interface utilisateur personnalisée.

textareaInput("textareaID","Text Area Label", "Insert text here...", rows = 20, cols = 35)
3
répondu Steve Ladavich 2017-05-23 11:54:38

Voici une solution rapide qui préserve la sensation d'entrée brillante, mais permet un nombre personnalisé de colonnes:

textareaInput <- function(inputID, label, value="", rows=10, columns=80) {
  HTML(paste0('<div class="form-group shiny-input-container">
    <label for="', inputID, '">', label,'</label>
    <textarea id="', inputID, '" rows="', rows,'" cols="', 
    columns,'">', value, '</textarea></div>'))
}

Dans votre script ui.R, Vous pouvez ajouter:

textareaInput("shazam", "My text box")


Note: pour obtenir une sensation Bootstrap à la zone de texte, vous pouvez utiliser:

textareaInput <- function(inputID, label, value="", rows=10) {
  HTML(paste0('<div class="form-group shiny-input-container">
              <label for="', inputID, '">', label,'</label>
              <textarea class="form-control" id="', inputID, 
              '" rows="', rows, '">', value, '</textarea></div>'))
}
2
répondu Megatron 2016-03-08 16:13:59