如何在R Shiny中保存当前工作区

时间:2017-07-10 08:11:24

标签: r download shiny

我想允许我的用户将他们当前的工作区保存到他们选择的目录中。我无法使其发挥作用。

以下是我的代码。有什么建议?提前谢谢。

ui.R:

shinyUI(fluidPage(
  titlePanel("Save RData"),
  sidebarLayout(
    sidebarPanel(
    ),
    mainPanel(
      downloadButton('download_structure', "Save")
    )
  )
))

server.R

shinyServer(function(input, output) {

  output$download_structure <- downloadHandler(
    filename = function() {paste("Test.RData")},
    content  = function(file) {
      list = ls(all.names = TRUE)
    }
  )

})

修改

我也尝试了以下代码。

我输入了“C:/ Users / MyName / Desktop /”或“C:// Users // MyName // Desktop //”作为输入$ RDdata_dir_save。两者都不起作用。

任何建议都会非常感激!

我的ui.R的片段:

textInput("RData_name_save", "RData name"),
textInput("RData_dir_save", "Save directory"),

我的服务器片段.R:

tempdir  <- paste0(input$RData_dir_save,input$RData_name_save,'.RData"')
save.image(file=eval(parse(text=tempdir)))          

2 个答案:

答案 0 :(得分:0)

我尝试了使用directoryInput并从用户处获取文件名的解决方法。此解决方案不使用downloadHandler功能,它只是一个临时解决方法。 为了选择目录,我使用directoryInput作为配置here

<强> ui.R

library(shiny)

shinyUI(fluidPage(
  fluidRow(
    column(
      width = 10,
      titlePanel("Save RData"),
      directoryInput('directory', label = 'select directory'),
      hr(),
      textOutput("dir"),
      textInput("file_name","give file name"),
      actionButton("save","Save RData"),
      conditionalPanel( 
        condition="output.saved!=0",
        h4('Saved successfully')
      )
    )
  )
))

注意: conditionalPanel触发actionButton

中的保存后,会显示sever.R

<强> server.R

library(shiny)

shinyServer(function(input, output, session) {

  observeEvent(input$save,{
    SaveRData()
  })

  observeEvent(
    ignoreNULL = TRUE,
    eventExpr = {
      input$directory
    },
    handlerExpr = {
      if (input$directory > 0) {
        # condition prevents handler execution on initial app launch

        path = choose.dir(default = readDirectoryInput(session, 'directory'))
        updateDirectoryInput(session, 'directory', value = path)
      }
    }
  )

  output$directory = renderText({
    readDirectoryInput(session, 'directory')})

    SaveRData <- reactive({
      if(!(is.null(dir) && is.null(input$save) && is.null(input$file_name))){
        dir <- readDirectoryInput(session, 'directory')
        file_name <- paste(input$file_name,".RData", sep="")
        save.image(file = paste(dir,file_name, sep = "\\"))
        }
    })

    output$saved<-reactive({input$save})

    outputOptions(output, 'saved', suspendWhenHidden = FALSE)
  })

只要按下save按钮,就会触发SaveRData功能,该功能基本上使用save.image(...)来自input的参数。

快照: 1.的 UI snap1-ui

2. 输出目录 snap2-folder

答案 1 :(得分:0)

问题在于对象不在光亮的环境中,而save.image()不会保存任何有趣的东西。

也许是有趣的,复制自https://groups.google.com/forum/#!topic/shiny-discuss/_iLbT3Aaz3I

我经常希望我可以在闪亮的应用程序中以交互方式进行交互工作,类似于在函数中使用Browse()。有时,我使用闪亮的GUI进入只想保存内容的状态。

因此,我写了一些可以保存所有闪亮应用程序对象的东西,该对象使用Hadley的pryr包来递归列出这些对象。因此,您需要在某个地方使用它(我认为它属于global.R或server.R) 图书馆(pryr)

在ui.R中,您需要一个操作按钮。您可以将其添加到现有的闪亮示例之一中。 actionButton(“ save_objs”,“保存对象”)

在server.R中,我有这段代码,它监听save_objs:

observeEvent(input$save_objs, {
    # Run whenever save_objs button is pressed

    print("** saving objects! **")

    ## Print the objects being saved
    print(rls())
    # ## Put  objects into current environment
    for(obj in unlist(rls())) {
        if(class(get(obj, pos =  -1))[1] == "reactive"){
            ## execute the reactive objects and put them in to this 
            ## environment i.e. into the environment of this function
            assign(obj, value = eval(call(obj)))
        } else {
            ## grab the global variables and put them into this 
            ## environment
            assign(obj, value = get(obj, pos =  -1))
        }
    }

    input_copy <- list()
    for(nm in names(input)){
        # assign(paste0("input_copy$", nm), value <- input[[nm]])
        input_copy[[nm]] <- input[[nm]]
    }

    ## save objects in current environment
    save(list = ls(), file = "shiny_env.Rdata", envir = environment())

    print("** done saving     **")
})

我在开发过程中经常使用打印语句,请随时忽略它们。

这花了我一段时间,所以希望可以节省其他人的时间(也许以后我忘记了并在Google上搜索“ R如何将对象保存为闪亮的对象”时也可以)。

作为旁注,我不明白rl如何使用反应性对象找到环境。我目前的预算中没有购买R的Hadley的Advanced Programming的功能,所以我将不得不等待找出答案。我试图直接使用parent.frame和parent.env的各种组合来获取对象,但是我只能在常规搜索路径中找到Shiny内部对象和对象。所以...那个pryr软件包中有一些聪明的东西。