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")
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.
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 )
)
))
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.)
À Partir de la version 0.14 brillant possède une mise en œuvre de textAreaInput
.
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)
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>'))
}