brillant 4 petites textInput boîtes de side-by-side
J'ai un brillant server version 0.4.0 et je veux avoir 4 petits textInput boîtes à ressembler à ceci:
x-min x-max y-min y-max
[...] [...] [...] [...]
Ils maintenant ressembler à ceci:
x-min
[...................]
x-max
[...................]
y-min
[...................]
y-max
[...................]
Avec ce code:
textInput(inputId="xlimitsmin", label="x-min", value = 0.0),
textInput(inputId="xlimitsmax", label="x-max", value = 0.5),
textInput(inputId="ylimitsmin", label="y-min", value = 0.5),
textInput(inputId="ylimitsmax", label="y-max", value = 1.0),
Des idées comment faire?
ÉDITÉ: j'ai changé des choses comme ça ailleurs dans le code:
<style type="text/css">select#yaxis4 { height: 280px; width: 500px; }</style>
[... which links to this later on in the page...]
<label class="control-label" for="yaxis4">Y-Axis</label>
<select id="yaxis4" multiple="multiple">
Et c'est à quoi il ressemble pour ceux qui ne travaillent pas:
<style type="text/css">select#xlimitsmax { display: inline-block; max-width: 50px; }</style>
[... which links to...]
<label>x-max</label>
<input id="xlimitsmax" type="text" value="0.5"/>
ÉDITÉ:
Ici est un autonome exemple ui.R
qui ne fonctionne pas:
library(shiny)
shinyUI(
pageWithSidebar(
# application title
headerPanel("test01"),
sidebarPanel(
tags$head(
tags$style(type="text/css", "select { max-width: 360px; }"),
tags$style(type="text/css", ".span4 { max-width: 360px; }"),
tags$style(type="text/css", ".well { max-width: 360px; }")
),
wellPanel(
p(strong("Side Panel:"))
)
),
mainPanel(
textInput(inputId="xlimitsmin", label="x-min", value = 0.0),
tags$head(tags$style(type="text/css", "select#xlimitsmin { max-width: 50px }")),
textInput(inputId="xlimitsmax", label="x-max", value = 0.5),
tags$head(tags$style(type="text/css", "select#xlimitsmax { display: inline-block; max-width: 50px; }"))
)
))
Page:
- Où dans le code sont à votre
<style>
déclarations? Si vous venez de faire quelque chose comme changer la boîte de sélection des couleurs que le travail? - le style déclarations sont dispersés dans le brillant de l'interface utilisateur.R fichier et de se mettre dans le code html de la tête (
tags$head(tags$style(type="text/css", "select#something { height: 200px; width: 300px; }"))
). Si je fais quelque chose comme ce qui suit, ne fonctionne toujours pas:tags$head(tags$style(type="text/css", "select#xlimitsmin { max-width: 50px }"))
- Ping! Bounty en 6 heures peut vous donnez à quelqu'un?
- J'ai obtenu 16 heures? Je vais essayer les réponses de retour demain dans le bureau de 12 heures de temps.
Vous devez vous connecter pour publier un commentaire.
pour paraphraser (et pour simplifier le cas de 2 entrées), le problème est que:
montre
Mais vous voulez side-by-side de petites entrées, comme suit:
La réponse courte
donne:
La réponse longue
Side-by-Side entrées
Faisons côte-à-côté:
Actuellement textInput génère deux balises - les
label
, et lainput
, chacun de qui est configuré par CSSdisplay:block
, ce qui signifie que c'est un rectangle qui va rompre avec le côté gauche du conteneur. Nous avons besoin d'envelopper chaquetextInput
's de terrain dans un nouveau conteneur (div) et de dire que le conteneur le conteneur qui le suit (la prochainetextInput
) est autorisé à être sur la même ligne horizontale sur la page, à l'aide de CSS,display:inline-block
.Nous avons donc ajouter un div avec un style autour de chaque
textInput
:Petites entrées
Maintenant, nous allons traiter avec des petits. Il ya quelques façons de faire de petites,
Depuis
bootstrap.js
est vraiment le contrôle de la mise en page lorsque nous utilisons brillant, à seulement 3 sera fiable de travail, nous allons donc l'utiliser.Entrée tailles sont documentées dans Bootstrap 2.3.2 CSS les Formulaires de documentation, sous le Contrôle de Dimensionnement'. Il comprend une variété de tailles, de la mini, small, medium, large, xlarge, et xxlarge, et la valeur par défaut est probablement moyen. Essayons de petites, à la place.
Pour définir la taille, nous avons besoin de changer la classe de l'
input
balise générée partextInput
.Maintenant
textInput
est juste une fonction de commodité autour de la plus puissantetags
fonctions telles quetags$label
ettags$input
. Nous pouvons construire une version plus puissante detextInput
qui nous permet de configurer les éléments, notamment la classe de l'input
nœud:Et nous sommes en fait -, mais on peut rouler à certaines de ces fonctionnalités par avoir
textInput3
générer la balise div. Il pourrait également définir la classe en elle-même, mais je vais laisser cela pour vous écrire.De l'emballer
Pour les intérêts de souci, voici la version à l'aide de la classe
input-mini
:À l'aide de la dernière version de Brillant, vous pouvez accomplir cela en mettant l'entrée des appels au sein d'un splitLayout(). Cela permettra de diviser le liquide de ligne, boîte, etc. dans les colonnes nécessaires requis pour afficher vos champs d'entrée side-by-side.
L'exemple ci-dessous vous donnent trois saisies de texte dans une boîte, qui apparaissent côte à côte dans la fluidRow.
box
est à partir de lashinydashboard
paquetPeut-être que cette solution n'est pas dans la en 2013, mais si vous voulez faire cela sans écrire de code HTML ou CSS, vous pouvez simplement utiliser le
column
fonction au sein d'unefluidRow
comme suit:Et il mettra les choses de l'autre côté.
EDIT: Maintenant, il y a un autre moyen très facile de faire cela en utilisant la
splitLayout()
fonction. Voir Nadir Sidi réponse pour plus de détails.J'ai supprimé l'ancien réponse - en voici un qui fonctionne:
de l'interface utilisateur.r:
Voici les modifications que j'ai apportées:
1) j'ai éliminé le
select
deselect#xlimitsmax
etselect#xlimitsmin
dans votre.css
états2), j'ai mis vos deux contrôles chacun dans leur propre
div()
et leur a donné les nomsXXmin
etXXmax
. J'ai ensuite ajouté.css
états afin de les rendre inline-block.Si vous avez un tas de ces, vous pouvez utiliser un
class
de l'instruction telle que:alors vous pouvez marquer chacun de contrôle
div()
's queclass="MyClass"
et utiliser seulement une.css
déclaration.Édité à ajouter: Merci pour l'affichage de l'exemple de code qui fait qu'il est beaucoup plus facile.
2ème Edit: Juste pour clarifier. Le point de mettre la
textInput
commandes à l'intérieur d'undiv()
est d'unir la zone d'entrée et son étiquette en un objet unique, de sorte que les styles (dans ce cas, ledisplay
style) peut être appliqué. Si vous ne le faites pas, l'étiquette et la boîte de loi en deux entités distinctes, et il est difficile de les manipuler dans de tels cas.Comme une alternative à la mise détaillé des déclarations de style dans une classe, il semble que vous pouvez facilement étendre la brillante tags fonctions à votre goût. Ce serait pratique d'avoir autour par défaut.
(c'est avec brillant shiny_0.14.1 ). Je pensais que j'allais avoir besoin d'écrire une fermeture, mais cela semble fonctionner.
Si vous voulez les entrées dans mainPanel vous pouvez utiliser les éléments suivants:
Ajouter:
dans un fichier css (par exemple, le style.css dans le répertoire www/) dans votre application et de la source à partir de l'interface utilisateur.R:
includeCSS('www/style.R')
Je ne suis pas sûr de savoir pourquoi vous avez besoin d'un textInput plutôt qu'un numericInput depuis l'entrée vous semblent être à la recherche pour les numériques. Si vous choisissez numericInput vous pouvez simplement remplacer le composant textInput avec numericInput ci-dessus. Si vous voulez les entrées dans la sidebarPanel vous pouvez utiliser le code ci-dessous. Le même fichier css mentionnés ci-dessus seraient nécessaires.
Je n'étais pas heureux avec
splitLayout()
, car elle introduit des barres de défilement lorsque l'espace est limité.J'ai trouvé que, au moins pour l'entrée des widgets comme des boutons ou des zones de texte, une assez facile une solution à un meilleur comportement réactif est à l'aide de flex-zone: (voir cet excellent guide: https://css-tricks.com/snippets/css/a-guide-to-flexbox/)
Il est possible d'ajuster la largeur relative. Correspondant à
splitLayout(cellWidths = c("25%", "75%"), ...)
: