2015-12-18 2 views
1

Я изо всех сил стараюсь использовать реактивную среду в среде tabPanel в Shiny.Использование реактивных вызовов в среде tabPanel в Shiny

Я хочу использовать реактивный файл данных в среде tabPanel во входной панели в Shiny. Далее следует код (я генерировать данные для использования в C:/Temp ниже):

данных:

dir.create(file.path("C:","Temp"), showWarnings = FALSE) 
write.csv(rbind("A","B","C","D"), "C:/Temp/A.csv",row.names = FALSE) 
write.csv(rbind("A","B","C","D"), "C:/Temp/B.csv",row.names = FALSE) 
write.csv(rbind("A","B","C","D"), "C:/Temp/C.csv",row.names = FALSE) 

Shiny:

--- 
title: "Reactive in Tab environment" 
output: html_document 
runtime: shiny 
--- 

```{r setup, include=FALSE} 
knitr::opts_chunk$set(echo = TRUE) 
``` 

```{r , echo=FALSE} 
    navbarPage("Analysis", 
    tabPanel("File Choice", 
     inputPanel(
     selectInput("File", label = "File Choice", 
        choices = c("A","B","C"), selected = c("A","B","C")[1]) 
        ), 
    Data <- reactive({read.csv(paste0("C:/Temp/",input$File,".csv"))}) 
    ), 
    tabPanel("File Show", 
     inputPanel(
     selectInput("Choices", label = "Choices", 
        choices = Data()[,1], selected = Data()[,1][1]) 
        ))) 


    ``` 
+0

@slickrickulicious Да, я хочу встроить приложение в Rmarkdown, а также .. – Nick

+0

В чем проблема? – MLavoie

+0

@MLavoie, как уже упоминалось, я не могу заставить этот пример работать. Кажется, что реактивный вызов в среде tabPanel терпит неудачу. Это всего лишь один пример, я пробовал другие итерации. Любые идеи о том, как заставить этот MWE работать? То есть получить две рабочие панели ввода? – Nick

ответ

2

Я думаю писать блестящие приложения в RMarkdown документов может быть несколько запутанным, поскольку разделение между UI/сервером ввода/вывода не определяется резко.

Я бы взял ваши реактивные значения (Data) и другие вещи, которые могли бы зайти на сервер, и определить их за пределами ваших компонентов пользовательского интерфейса (navbarPage, tabPanels и т. Д.).

Я также хотел бы написать различные компоненты интерфейса отдельно, но это только личное предпочтение (и вы также можете записать их в разных документах и ​​исправить их, чтобы уменьшить код).

В следующем примере (очень похоже на ваш) три документа могут быть выбраны на одной вкладке, а затем напечатаны как таблица под другой вкладкой. Обратите внимание: вам нужно будет исправить путь к тому, где у вас есть документы (я бы использовал file.path, чтобы вы знали, что проблем не будет на разных ОС).

--- 
title: "Reactive in Tab environment" 
runtime: shiny 
output: 
    html_document 
--- 

```{r setup, include=FALSE} 
knitr::opts_chunk$set(echo = TRUE) 

## For reproducibility you can run this to create a Temp directory with 
## some data.frames in your current directory 
if (!file.exists('Temp')) { 
    dir.create('Temp') 
    for (f in paste0(LETTERS[1:3], '.csv')) 
    write.csv(data.frame(A=sample(letters[1:10]), B=sample(10)), file.path('Temp', f)) 
} 
``` 

```{r app, echo=FALSE} 

## Initialize data with something 
## Replace the path in `file.path` with the path to your files 
docs <- paste0(LETTERS[1:3], '.csv')      # your documents 
Data <- reactive({ 
    f <- if (is.null(input$File)) docs[[1]] else input$File # initialize reading A.csv 
    read.csv(file.path('Temp', f)) 
}) 

## UI components 
## Note: these are not reactive, so when you want to use a reactive value like Data(), 
## wrap it in isolate(). 
## I like to separate things, but also could plug in to tabPanels 
panel1 <- tagList(
    inputPanel(
    selectInput("File", label = "File Choice", 
       choices = docs, selected=docs[[1]]) 
) 
) 

panel2 <- tagList(
    sidebarLayout(
    sidebarPanel(
     selectInput("Choices", label = "Choices", 
        choices = isolate(Data()[,1]), 
        selected = isolate(Data()[,1][[1]]) 
       ) 
    ), 
    mainPanel(
     renderTable({ Data() }) 
    ) 
) 
) 

navbarPage("Analysis", 
      tabPanel("File Choice", panel1), 
      tabPanel("File Show", panel2)) 

    ``` 
+0

Спасибо, что это довольно аккуратно! Я согласен, гораздо проще держать все в стороне. – Nick

+0

Я также сталкивался с функцией renderUI(), которая позволяет использовать реактивные данные в вызовах selectInput. – Nick

Смежные вопросы