J'essaie de créer des webapp simples où je souhaite prendre une entrée multiligne à partir de l'utilisateur à l'aide de HTML TextArea Control. Y a-t-il une manière de créer un tel contrôle d'entrée en brillant?
Page d'aide de TextInput ne montre 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")
Vous pouvez ajouter une textarea à l'aide de tags
et il doit être ramassé automatiquement par Shiny:
tags$textarea(id="foo", rows=3, cols=40, "Default value")
Ou si vous êtes plus à l'aise avec HTML droit, vous pouvez aussi faire
HTML('<textarea id="foo" rows="3" cols="40">Default value</textarea>')
Dans tous les cas, input$foo
devrait refléter la valeur de Textarea.
Pour le bénéfice des autres, je publierai comment j'ai résolu le problème en utilisant un contrôle de l'interface utilisateur personnalisé suivant le tutoriel brillant
Premièrement, j'ai créé le fichier textarea.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 UI.R de Shiny WebApp avant que Shinyui () est appelée
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 Texarea souhaité dans UI.R.
shinyUI(pageWithSidebar(
# Application title
headerPanel("Test Header Panel"),
sidebarPanel(),
mainPanel(
inputTextarea('exampleTextarea', '',20,35 )
)
))
Peut-être ou peut ne pas être pertinent ici, mais j'ai fait le package shinyace pour conclure et exposer l'éditeur de texte ACE en brillant. ACE est principalement utilisé pour l'édition de code (complète avec la syntaxe en surbrillance pour une variété de langues), mais fournit une interface de type texte pour écrire la composition de texte/code multi-lignes.
Vous pouvez Découvrez l'exemple pour voir si cela pourrait être ce que vous recherchez. (Essayez différents "modes" pour la surbrillance de la syntaxe et les thèmes des combinaisons de couleurs.)
De la version .14 Shiny a une implémentation de textAreaInput
.
S'appuyant sur la réponse de Joe ( https://stackoverflow.com/a/14452837/5776618 ), vous pouvez également nier des balises dans votre propre fonction pour obtenir la même sortie que l'entrée intégrée brillante standard. les fonctions.
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 voulez) tout en restant ...
L'utilisation de la fonction est la même que si vous utilisez l'intégré ou si vous avez construit une interface utilisateur personnalisée.
textareaInput("textareaID","Text Area Label", "Insert text here...", rows = 20, cols = 35)