我想允许我的用户将他们当前的工作区保存到他们选择的目录中。我无法使其发挥作用。
以下是我的代码。有什么建议?提前谢谢。
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)))
答案 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 :(得分: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软件包中有一些聪明的东西。