2015-06-17 2 views
3

Я хочу, чтобы импортировать файл с .rdata FileInput, но он не работает, у меня есть сообщение об ошибке:Не можете прочитать .rdata FileInput

Ошибка в my.data $ TYPE_DE_TERMINAL: $ оператора является недопустимым для атомных векторов

dt <- reactive({ 

    inFile <- input$file1 

    if (is.null(inFile)) 
     return(NULL) 

    load(inFile$datapath) 
    }) 






    GetData <- reactive({ 
    my.data <- dt() 

Когда я пытаюсь мое приложение с .rdata импортируемого вручную он работает хорошо (я remplaced Dt() непосредственно с dataframe в моем каталоге) ...

+0

up! Я уверен, что проблема возникла из команды load, но я не решаю ее –

ответ

3

В следующем примере решается проблема. Он позволяет загружать все файлы .RData.

Благодаря @Spacedman за то, что указали на лучший подход к загрузке данных: Загрузите файл в новую среду и получите его оттуда.

В качестве примера, являющегося «автономным», я вставил верхнюю секцию, которая хранит два вектора на вашем диске, чтобы загрузить их позже.

library(shiny) 

# Define two datasets and store them to disk 
x <- rnorm(100) 
save(x, file = "x.RData") 
rm(x) 
y <- rnorm(100, mean = 2) 
save(y, file = "y.RData") 
rm(y) 

# Define UI 
ui <- shinyUI(fluidPage(
    titlePanel(".RData File Upload Test"), 
    mainPanel(
    fileInput("file", label = ""), 
    actionButton(inputId="plot","Plot"), 
    plotOutput("hist")) 
) 
) 

# Define server logic 
server <- shinyServer(function(input, output) { 
    observeEvent(input$plot,{ 
    if (is.null(input$file)) return(NULL) 
    inFile <- isolate({input$file }) 
    file <- inFile$datapath 
    # load the file into new environment and get it from there 
    e = new.env() 
    name <- load(file, envir = e) 
    data <- e[[name]] 

    # Plot the data 
    output$hist <- renderPlot({ 
     hist(data) 
    }) 
    }) 
}) 

# Run the application 
shinyApp(ui = ui, server = server) 
+3

Обратите внимание, что это будет прерываться, если имя вещи, загруженной при выполнении 'data = load (file)', само является 'data', потому что назначение на 'data' будет перезаписываться' data', созданный 'load'. Альтернативой является загрузка в новую среду; 'e = new.env(); load (файл, env = e); e [["data"]] 'для получения' данных' из сохраненного файла. Также работает, если '.Data' имеет более одного объекта. – Spacedman

+0

@Spacedman Спасибо, что указали это и заставили меня чему-то научиться! :) Я улучшил свой ответ в соответствии с вашим комментарием. – symbolrush

+0

Это решение хорошо работает с '.RData', содержащим только один объект, как в примерах' x.RData' и 'y.RData', но с ошибкой с .RData', содержащей несколько объектов. Любое быстрое решение или я должен открыть новый вопрос? – tictocchoc

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