2014-10-06 1 views
0

Backgound: Вы можете "попросить" RStudio генерировать пример R Markdown Блестящая документ, который содержит этот пример кода:R Shiny: несколько renderPlot вызовов в один R уценки документ

## Inputs and Outputs 

You can embed Shiny inputs and outputs in your document. 
Outputs are automatically updated whenever inputs 
change. This demonstrates how a standard R plot can be 
made interactive by wrapping it in the Shiny 
`renderPlot` function. The `selectInput` and 
`sliderInput` functions create the input widgets used to 
drive the plot. 

```{r, echo=FALSE} 
inputPanel(
    selectInput("n_breaks", label = "Number of bins:", 
       choices = c(10, 20, 35, 50), selected = 20), 

    sliderInput("bw_adjust", label = "Bandwidth adjustment:", 
       min = 0.2, max = 2, value = 1, step = 0.2) 
) 

renderPlot({ 
    hist(faithful$eruptions, probability = TRUE, breaks = as.numeric(input$n_breaks), 
     xlab = "Duration (minutes)", main = "Geyser eruption duration") 

    dens <- density(faithful$eruptions, adjust = input$bw_adjust) 
    lines(dens, col = "blue") 
}) 
``` 

Обратите внимание, что этот пример делает не используйте папку, содержащую ui.R и server.R.

ПРОБЛЕМА: Если вы копируете это несколько раз, первый работает так, как ожидалось, и последующие отображаются также, но не реагируют на изменения входных параметров.

ВОПРОС: Как создать документ R Markdown с несколькими встроенными графиками, как указано выше (без использования внешних папок с ui.R и server.R), но гарантируя, что каждый из них работает в интерактивном режиме?

ответ

3

Вы должны дать различные идентификаторы для ваших входных элементов, что-то вроде этого:

First embedded shiny plot : 

```{r} 
inputPanel(
    selectInput("n_breaks", label = "Number of bins:", 
       choices = c(10, 20, 35, 50), selected = 20), 

    sliderInput("bw_adjust", label = "Bandwidth adjustment:", 
       min = 0.2, max = 2, value = 1, step = 0.2) 
) 

renderPlot({ 
    hist(faithful$eruptions, probability = TRUE, breaks = as.numeric(input$n_breaks), 
     xlab = "Duration (minutes)", main = "Geyser eruption duration") 

    dens <- density(faithful$eruptions, adjust = input$bw_adjust) 
    lines(dens, col = "blue") 
}) 
``` 

Second embedded shiny plot : 

```{r} 
inputPanel(
    selectInput("n_breaks2", label = "Number of bins:", 
       choices = c(10, 20, 35, 50), selected = 20), 

    sliderInput("bw_adjust2", label = "Bandwidth adjustment:", 
       min = 0.2, max = 2, value = 1, step = 0.2) 
) 

renderPlot({ 
    hist(faithful$eruptions, probability = TRUE, breaks = as.numeric(input$n_breaks2), 
     xlab = "Duration (minutes)", main = "Geyser eruption duration") 

    dens <- density(faithful$eruptions, adjust = input$bw_adjust2) 
    lines(dens, col = "blue") 
}) 
``` 
3

Как описано, например, в RStudio Shiny Tutorial, первый параметр виджета функции является виджет имя, которое идентифицирует виджет. Множество виджетов с одинаковым именем не будут использоваться, поэтому просто создание двух экземпляров примера не создает двух рабочих копий.

Чтобы заставить его работать, вы должны сделать имена виджетов уникальными в каждом вызове inputPanel, а затем использовать эти имена в вызовах renderPlot.