दिलचस्प पोस्ट
सर्वश्रेष्ठ प्रदर्शन के साथ सर्वलेट प्रतिक्रिया के लिए चित्र लेखन पुनरावर्तक हेडर या पाद लेख में नियंत्रण कैसे खोजें जावास्क्रिप्ट jsfiddle.net पर नहीं चल रहा है दो अनुप्रयोगों के बीच एंड्रॉइड संचार एडीआई नियंत्रक 404 देता है जब आईडी में अवधि होती है अजगर 2.7 में openssl को अद्यतन करना मैं कैसे पर्ल से ClearCase के साथ बातचीत कर सकता हूँ? क्यों DropDownListFor सबमिट करने के बाद एकाधिक चयन खो देते हैं, लेकिन ListBoxFor नहीं करता है? उद्देश्य-सी: लाइन से एक फ़ाइल लाइन पढ़ना FileResult का उपयोग करते हुए Asp.Net MVC में किसी भी प्रकार की फ़ाइल डाउनलोड करें? अनुक्रमितों का सी ++ सॉर्टिंग और रखे जाने का तरीका कोणीय के साथ jQuery का उपयोग कैसे करें? डाउनलोड सुविधा asp.net में अपडेट पैनल के भीतर काम नहीं कर रही है मैं 2 डी अंक को 3 डी में कैसे बदल सकता हूं? MapView में नक्शा मार्कर के ऊपर पॉपअप दिखाएं

एक चमकदार ऐप में बने भूखंड सहेजें

मैं यह समझाने की कोशिश कर रहा हूं कि कैसे डाउनलोडबटन का उपयोग करने के लिए साजिश को चमकदार रखने के लिए। पैकेज में दिए गए उदाहरण डाउनलोड बटन / डाउनलोडहैंडलर को .csv को बचाने के लिए दर्शाता है मैं उस पर आधारित एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण बनाने जा रहा हूं।

ui.R

 shinyUI(pageWithSidebar( headerPanel('Downloading Data'), sidebarPanel( selectInput("dataset", "Choose a dataset:", choices = c("rock", "pressure", "cars")), downloadButton('downloadData', 'Download Data'), downloadButton('downloadPlot', 'Download Plot') ), mainPanel( plotOutput('plot') ) )) 

server.R लिए। server.R

 library(ggplot2) shinyServer(function(input, output) { datasetInput <- reactive({ switch(input$dataset, "rock" = rock, "pressure" = pressure, "cars" = cars) }) plotInput <- reactive({ df <- datasetInput() p <-ggplot(df, aes_string(x=names(df)[1], y=names(df)[2])) + geom_point() }) output$plot <- renderPlot({ print(plotInput()) }) output$downloadData <- downloadHandler( filename = function() { paste(input$dataset, '.csv', sep='') }, content = function(file) { write.csv(datatasetInput(), file) } ) output$downloadPlot <- downloadHandler( filename = function() { paste(input$dataset, '.png', sep='') }, content = function(file) { ggsave(file,plotInput()) } ) }) 

यदि आप इस प्रश्न का उत्तर दे रहे हैं, तो आप शायद इस से परिचित हैं, लेकिन यह काम करने के लिए, उपर्युक्त को अलग-अलग लिपियों ( ui.R और server.R को कार्य निर्देशिका में एक फ़ोल्डर ( foo ) में server.R । चमकदार चलाने के लिए ऐप, runApp("foo")

ggsave का उपयोग करते ggsave मुझे एक त्रुटि संदेश मिलता है जो इंगित करता है कि ggsave filename फ़ंक्शन का उपयोग नहीं कर सकता (मुझे लगता है)। अगर मैं मानक ग्राफिक्स डिवाइस (नीचे की तरह) का उपयोग करता हूं, तो Download Plot किसी त्रुटि के बिना कार्य करता है, लेकिन यह ग्राफिक नहीं लिखता है

डाउनलोड पाने के लिए कोई सुझाव प्लान लिखने के लिए काम करने वाले हैंडलर की सराहना की जाएगी।

वेब के समाधान से एकत्रित समाधान "एक चमकदार ऐप में बने भूखंड सहेजें"

निश्चित नहीं कि यह सवाल अभी भी सक्रिय है, लेकिन यह पहली बार है, जो "चमकदार ऐप में बचत के भूखंडों" की तलाश करते हुए आया था, इसलिए मैं जल्दी से जोड़ना चाहता था कि कैसे जीजावे को मूल प्रश्न की तर्ज पर डाउनलोडहैंडलर के साथ काम करने के लिए मिला।

जीजावे के बजाए सीधा आउटपुट का उपयोग करके जुबबा द्वारा सुझाए गए वैकल्पिक रणनीतियों और एलेक्जवान ने खुद को अच्छा काम करने के लिए सुझाव दिया है, यह केवल उन लोगों के लिए है जो डाउनलोडशेडर में जीजावे का उपयोग करना चाहते हैं)।

एलेक्ज़वेन द्वारा रिपोर्ट की गई समस्या का कारण ggsave सही ग्राफिक्स डिवाइस के लिए फ़ाइल एक्सटेंशन से मेल खाने की कोशिश कर रहा है। अस्थायी फ़ाइल, हालांकि, एक एक्सटेंशन नहीं है, इसलिए मिलान विफल रहता है। यह विशेष रूप से डिवाइस को ggsave फ़ंक्शन कॉल में सेट किया जा सकता है, जैसे कि मूल कोड उदाहरण में (एक पीएनजी के लिए):

 output$downloadPlot <- downloadHandler( filename = function() { paste(input$dataset, '.png', sep='') }, content = function(file) { device <- function(..., width, height) grDevices::png(..., width = width, height = height, res = 300, units = "in") ggsave(file, plot = plotInput(), device = device) } ) 

यह कॉल मूल रूप से device फ़ंक्शन को png लिए लेता है जो आंतरिक रूप से असाइन करता है (आप jpg , pdf , आदि के लिए सिंटैक्स देखने के लिए ggsave फ़ंक्शन कोड देख सकते हैं)। शायद, आदर्श रूप में, कोई फ़ाइल एक्सटेंशन निर्दिष्ट कर सकता है (यदि फ़ाइल नाम से अलग – जैसा कि अस्थायी फ़ाइल के लिए मामला है) ggsave पैरामीटर के रूप में, लेकिन यह विकल्प वर्तमान में ggsave में उपलब्ध नहीं है।


कम से कम आत्मनिहित कार्य उदाहरण:

 library(shiny) library(ggplot2) runApp(list( ui = fluidPage(downloadButton('foo')), server = function(input, output) { plotInput = function() { qplot(speed, dist, data = cars) } output$foo = downloadHandler( filename = 'test.png', content = function(file) { device <- function(..., width, height) { grDevices::png(..., width = width, height = height, res = 300, units = "in") } ggsave(file, plot = plotInput(), device = device) }) } )) sessionInfo() # R version 3.1.1 (2014-07-10) # Platform: x86_64-pc-linux-gnu (64-bit) # # locale: # [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C # [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 # [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 # [7] LC_PAPER=en_US.UTF-8 LC_NAME=C # [9] LC_ADDRESS=C LC_TELEPHONE=C # [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C # # attached base packages: # [1] stats graphics grDevices utils datasets methods base # # other attached packages: # [1] ggplot2_1.0.0 shiny_0.10.1 # # loaded via a namespace (and not attached): # [1] bitops_1.0-6 caTools_1.17 colorspace_1.2-4 digest_0.6.4 # [5] formatR_1.0 grid_3.1.1 gtable_0.1.2 htmltools_0.2.6 # [9] httpuv_1.3.0 labeling_0.2 MASS_7.3-34 munsell_0.4.2 # [13] plyr_1.8.1 proto_0.3-10 Rcpp_0.11.2 reshape2_1.4 # [17] RJSONIO_1.3-0 scales_0.2.4 stringr_0.6.2 tools_3.1.1 # [21] xtable_1.7-3 

अद्यतन करें

Ggplot2 संस्करण 2.0.0 के अनुसार, ggsave फ़ंक्शन, device पैरामीटर के लिए चरित्र इनपुट का समर्थन करता है, इसका मतलब है कि ggsave द्वारा बनाई गई अस्थायी फ़ाइल को अब एक प्रत्यक्ष कॉल के साथ ggsave को सहेजा जा सकता है कि निर्दिष्ट किया जाना चाहिए कि "pdf" (बजाय एक डिवाइस समारोह में गुजरने के बजाय) यह निम्न उदाहरणों को निम्नलिखित के लिए सरल करता है

 output$downloadPlot <- downloadHandler( filename = function() { paste(input$dataset, '.png', sep='') }, content = function(file) { ggsave(file, plot = plotInput(), device = "png") } ) 

यहां एक समाधान है जो चमकदार भूखंडों को बचाने के लिए जीजीएसवे का उपयोग करने की अनुमति देता है यह ggsave() को कॉल करने के लिए एक लॉजिकल चेकबॉक्स और पाठ इनपुट का उपयोग करता है ui.R अंदर sidebarPanel फ़ाइल में इसे जोड़ें sidebarPanel :

 textInput('filename', "Filename"), checkboxInput('savePlot', "Check to save") 

फिर इसे चालू output$plot server.R output$plot फ़ंक्शन के बजाय server.R में server.R फ़ाइल:

 output$plot <- reactivePlot(function() { name <- paste0(input$filename, ".png") if(input$savePlot) { ggsave(name, plotInput(), type="cairo-png") } else print(plotInput()) }) 

एक उपयोगकर्ता तब पाठ बॉक्स में इच्छित फ़ाइल नाम टाइप कर सकता है (एक्सटेंशन के बिना) और ऐप निर्देशिका में सहेजने के लिए चेकबॉक्स को टिक कर सकता है। बॉक्स को अनचेक करना फिर से भूखंड को फिर से प्रिंट करता है मुझे यकीन है कि ऐसा करने के कुछ अच्छे तरीके हैं, लेकिन कम से कम अब मैं जीजीएसएवी और कैरो का इस्तेमाल विंडोज़ में कर सकता हूँ बहुत अच्छे पीएनजी ग्राफिक्स के लिए

कृपया आपके पास कोई सुझाव जोड़ें

मैंने इसे ggsave साथ काम करने का प्रबंधन नहीं किया, लेकिन ggsave png() को एक मानक कॉल के साथ यह ठीक लगता है।

मैंने केवल आपके server.R का output$downloadPlot server.R भाग को बदल दिया है। server.R फ़ाइल:

  output$downloadPlot <- downloadHandler( filename = function() { paste(input$dataset, '.png', sep='') }, content = function(file) { png(file) print(plotInput()) dev.off() }) 

ध्यान दें कि मुझे चमकदार के 0.3 संस्करण के साथ कुछ समस्याएं थीं, लेकिन यह गिथूब से नवीनतम के साथ काम करता है:

 library(devtools) install_github("shiny","rstudio") 

यह पुराना है, लेकिन फिर भी शीर्ष हिट तब होता है जब कोई "आर चमकदार बचाओ जीजीप्लोट" को छोड़ देता है, इसलिए मैं एक और वैकल्पिक हल में योगदान दूंगा। बहुत सरल … जीजीएसएव को उसी फ़ंक्शन में कॉल करें जो आपके ग्राफ़ को प्रदर्शित करता है, जो ग्राफ को सर्वर पर फ़ाइल के रूप में सहेज देगा।

 output$plot <- renderPlot({ ggsave("plot.pdf", plotInput()) plotInput() }) 

उसके बाद, file.copy() उपयोग करें और मौजूदा फ़ाइल से "फ़ाइल" पैरामीटर में डेटा लिखने के लिए file.copy() का उपयोग करें

 output$dndPlot <- downloadHandler( filename = function() { "plot.pdf" }, content = function(file) { file.copy("plot.pdf", file, overwrite=TRUE) } ) 

मेरे लिये कार्य करता है।