2016-02-05 4 views
2

Я использую Shiny как интерфейс для просмотра таблиц, хранящихся локально в серии .RData файлов, однако я не могу получить таблицу для рендеринга.Shiny: динамически загружать .RData файл

server Мой код выглядит так:

output$table1 <- renderTable({ 
load(paste0(input$one,"/",input$two,".RData")) 
myData}) 

На ui стороне я просто отображения таблицы в главной панели.

This other SO question предполагает, что проблема заключается в том, что среда, в которую загружаются данные, уходит, поэтому данные не отображаются. Они предлагают создать файл global и загрузить файл .RData, но я не верю, что смогу загружать данные динамически таким образом. Любые рекомендации по использованию .RData файлов в пределах shiny будут оценены.

С уважением

ответ

1

Я думаю, вам просто нужно, чтобы переместить load заявление вне функции renderTable. Таким образом, вы должны иметь

load(paste0(input$one,"/",input$two,".RData")) 
output$table1 <- renderTable({myData}) 

Если вы посмотрите на файл справки для renderTable, первый аргумент

выражение: выражение, которое возвращает объект R, который может быть использован с xtable.

load не возвращает это.

+0

Я думаю, что это еще один шаг, он должен «загружать» перед вызовом 'shinyServer()'. Я никогда не мог загрузить load(), чтобы загрузить в правильную среду, когда я попытался загрузить ее либо внутри функции рендеринга, либо в пределах наблюдения. –

+0

На самом деле, я просто попробовал, и все отлично с помощью 'runAppDir', где' load' вызывается в 'shinyServer' – csgillespie

+0

Не возражаете ли вы его переустановить? Я бы с удовольствием посмотрел. –

0

Я обошел это, «обманув» R Shiny. Я делаю BOGUS textOutput, а в renderText вызывает внешнюю функцию, которая на основе выбранного входа устанавливает уже глобально загруженные среды в единую среду под названием «e». Обратите внимание, что вы должны вручную загружать все RDatas в среды в global.R во-первых, с таким подходом. Предполагая, что ваши данные не такие большие или что у вас нет миллиона RDatas, это кажется разумным взломом.

По существу создавая loadEnvFn(), как показано ниже, который возвращает входной поток, переданный в качестве входного параметра $ datasetNumber, вы можете избежать проблем с областью определения, возникающих при добавлении кода в реактивный ({}) контекст. Я пытался сделать TON вещей, но все они требовали реактивного контекста. Таким образом, я мог бы изменить объекты, загруженные в e, без необходимости обменивать реактивную ({}) область вокруг моего блестящего кода сервера.

#Global Environment Pre-loaded before Shiny Server 
e = new.env() 
dataset1 = new.env() 
load("dataset1.RData", env=dataset1) 
dataset2 = new.env() 
load("dataset2.RData", env=dataset2) 
dataset3 = new.env() 
load("dataset3.RData", env=dataset3) 


ui = fluidPage(
    # Application title 
    titlePanel(title="View Datasets"), 

    sidebarLayout(
    # Sidebar panel 
    sidebarPanel(width=3, radioButtons(inputId = "datasetNumber", label = "From which dataset do you want to display sample data?", choices = list("Dataset1", "Dataset2", "Dataset3"), selected = "Dataset2") 
    ), 

    # Main panel 
    mainPanel(width = 9, 
     textOutput("dataset"), # Bogus textOutput 
     textOutput("numInEnv") 
    ) 
) 
) 

loadEnvFn = function(input) { 
    if (input$datasetNumber=="Dataset1") { 
    .GlobalEnv$e = dataset1 
    } else if (input$datasetNumber=="Dataset2") { 
    .GlobalEnv$e = dataset2 
    } else { 
    .GlobalEnv$e = dataset3 
    } 
    # Bogus return string unrelated to real purpose of function loadEnvFn 
    return(input$datasetNumber) 
} 

server = function(input, output, session) { 
    output$dataset = renderText(sprintf("Dataset chosen was %s", loadEnvFn(input)))   # Bogus output 
    output$numInEnv = renderText(sprintf("# objects in environment 'e': %d", length(ls(e)))) 
} 


shinyApp(ui, server) 
Смежные вопросы