চকচকে অ্যাপে তৈরি প্লটগুলি সংরক্ষণ করুন


85

আমি চকচকে দিয়ে একটি প্লট সংরক্ষণ করতে ডাউনলোডবটন কীভাবে ব্যবহার করব তা জানার চেষ্টা করছি। প্যাকেজের উদাহরণটি .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

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) সংরক্ষণ করুন the চকচকে অ্যাপ্লিকেশন চালানোর জন্য, চালনা করুন runApp("foo")

ব্যবহার করে ggsave, আমি একটি ত্রুটি বার্তা পেয়েছি যা ইঙ্গিত করে যে ggsave filenameফাংশনটি ব্যবহার করতে পারে না (আমার মনে হয়)। যদি আমি স্ট্যান্ডার্ড গ্রাফিক্স ডিভাইসটি (নীচের মত) Download Plotব্যবহার করি তবে কোনও ত্রুটি ছাড়াই কাজ করে তবে গ্রাফিকটি এটি লেখেন না।

প্লট লেখার জন্য হ্যান্ডলার কাজ করার জন্য কোনও পরামর্শই প্রশংসিত হবে।

উত্তর:


69

এই প্রশ্নটি এখনও সক্রিয় কিনা তা নিশ্চিত নয় তবে এটি "প্রথম চকচকে অ্যাপ্লিকেশনে প্লট সংরক্ষণের" জন্য অনুসন্ধানের সময় প্রথম এসেছিল তাই আমি কীভাবে মূল প্রশ্নের পংক্তিতে ডাউনলোডহ্যান্ডলারের সাথে কাজ করতে গুগস্যাভ পেতে পারি তাড়াতাড়ি যুক্ত করতে চেয়েছিলাম।

যুবা জিগস্যাভের পরিবর্তে প্রত্যক্ষ আউটপুট ব্যবহার করার পরামর্শ দিয়েছিল এবং অ্যালেক্সওয়ান নিজেই প্রস্তাবিত বিকল্প কৌশল উভয়ই দুর্দান্ত কাজ করে, এটি কেবল তাদের জন্য যারা ডাউনলোড হ্যান্ডলারে একেবারে 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যে ggsaveঅভ্যন্তরীণভাবে নির্ধারণ (আপনি তাকান করতে পারেন ggsaveফাংশন কোড সিনট্যাক্স দেখতে jpg, pdfইত্যাদি)। সম্ভবত, আদর্শভাবেই, 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 সংস্করণ ২.০.০ হিসাবে, ggsaveফাংশনটি deviceপ্যারামিটারের জন্য অক্ষর ইনপুট সমর্থন করে , এর অর্থ ডাউনলোডহ্যান্ডলার দ্বারা নির্মিত অস্থায়ী ফাইলটি এখন সরাসরি কলের মাধ্যমে সংরক্ষণ করা ggsaveযেতে পারে যা উল্লেখ করা উচিত যে এক্সটেনশনটি ব্যবহার করা উচিত যেমন উদাহরণ "pdf"(পাস করার পরিবর্তে) একটি ডিভাইস ফাংশনে)। এটি নিম্নলিখিতটিকে উপরের উদাহরণটিকে সহজতর করে

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

4
আমি বিশ্বাস করি আপনার উত্তরটি এখানে সঠিক। আপনি ggsave(file, plotInput(), device = png)কোনও ডিভাইস (মোড়ক) ফাংশন তৈরির পরিবর্তে কেবল ব্যবহার করতে পারেন ।
ইয়েহুই জি

@ সেবকোফফ মধ্যবর্তী বছরে আপনার উত্তরটি মিস করেছি এবং কিছুটা!
অ্যালেক্সওয়ান

4
@ ইহিহুই এই সমাধানটি আমার পক্ষে কাজ করে না: আর সংস্করণ ৩.১.০, জিপিপ্লট ২_০.০ চকচকে আছে।.০.১.১। বাক্স পপ আপ করুন, সংরক্ষণ করুন ক্লিক করুন, তবে কোনও ফাইল সংরক্ষণ করা হয়নি। কেউ কি নিশ্চিত করতে পারবেন?
zx8754

4
@ zx8754 আমি উত্তরে একটি সম্পূর্ণ উদাহরণ যুক্ত করেছি। দ্রষ্টব্য এটি আপনার আরআরস্টুডিওতে দেখার পরিবর্তে আপনার ওয়েব ব্রাউজারে চালানো উচিত, যেহেতু আরস্টুডিও ভিউয়ার ফাইল ডাউনলোড করতে অক্ষম হওয়ার একটি ज्ञিত বাগ রয়েছে।
ইহুই জাই

4
@ সেবকোফফ হ্যাঁ, আমি একটি বাস্তব উদাহরণ চেষ্টা করার পরে আমি এটি উপলব্ধি করেছিলাম, সুতরাং এখানে আমার প্রথম মন্তব্যটি আসলে ভুল ছিল। স্পষ্টতার জন্য ধন্যবাদ!
ইহুই জাই

24

এখানে একটি সমাধান যা চকচকে প্লটগুলি সংরক্ষণের জন্য ggsave ব্যবহার করার অনুমতি দেয়। এটি কল করার জন্য একটি লজিকাল চেকবক্স এবং পাঠ্য ইনপুট ব্যবহার করে ggsave()। এটি ui.Rভিতরে ফাইলটিতে যুক্ত করুন sidebarPanel:

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

তারপরে server.Rএটি বর্তমান output$plotপ্রতিক্রিয়াশীল প্লট ফাংশনের পরিবর্তে ফাইলটিতে যুক্ত করুন :

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

এরপরে ব্যবহারকারী কোনও পাঠ্যবক্সে পছন্দসই ফাইলের নাম টাইপ করতে পারেন (এক্সটেনশন ছাড়াই) এবং অ্যাপ্লিকেশন ডিরেক্টরিতে সঞ্চয় করতে চেকবাক্সটি টিক দিতে পারেন। বাক্সটি আনচেক করা আবার প্লটটি মুদ্রণ করে। আমি নিশ্চিত যে এটি করার আরও সুস্পষ্ট উপায় রয়েছে তবে কমপক্ষে আমি এখন বেশ ভাল পিএনজি গ্রাফিক্সের জন্য উইন্ডোজগুলিতে ggsave এবং কায়রো ব্যবহার করতে পারি।

দয়া করে আপনার যে কোনও পরামর্শ যুক্ত করুন।


isolateআশেপাশে কোনও ব্লক ছাড়াই input$filename, filenameপাঠ্য বাক্সে যে কোনও পরিবর্তন করা হয়েছে যদি বাক্সটি পরীক্ষা করা হয় তবে ফাইল সংরক্ষণের অনুরোধ জানানো হবে।
jpd527

23

আমি এটি দিয়ে কাজ করতে পরিচালিত করি নি ggsave, তবে একটি স্ট্যান্ডার্ড কল দিয়ে png()এটি ঠিক আছে বলে মনে হচ্ছে।

আমি কেবল output$downloadPlotআপনার server.Rফাইলের অংশটি পরিবর্তন করেছি :

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

দ্রষ্টব্য যে চকচকে এর ০.০ সংস্করণে আমার কিছু সমস্যা ছিল তবে এটি গিথুব থেকে সর্বশেষের সাথে কাজ করে:

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

ঠিক আছে, আমি গ্রহণ করতে যাচ্ছি যে ggsave ডাউনলোডহ্যান্ডলারের সাথে কার্যধারা এই পর্যায়ে কাজ করছে না। চকচকে ০.০ ডাউনলোড হ্যান্ডলারের সাথে আলাদা হয়ে গেছে, আপনি ঠিক বলেছেন। আমি একটি বিকল্প সমাধান পোস্ট করব যা আমি ডাউনলোডহ্যান্ডলার এড়িয়ে চাইলাম যা ggsave কাজ করার অনুমতি দেবে।
অ্যালেক্সওয়ান

4
@ যুবা কোনও ধারণা কেন পিডিএফ -তে একটি অনুরূপ (নন-জিজিপ্লাট 2) পদ্ধতিতে আউটপুট দেওয়ার চেষ্টা করে না? আমি কেবল একটি ভাঙা পিডিএফ পেয়েছি যা খোলেনি। প্লটইনপুট প্লট অবজেক্টের পরিবর্তে প্লট সরবরাহ করতে পারে না?
ভূগোলিক

20

এটি পুরানো, তবে এখনও কেউ শীর্ষে হিট যখন কেউ "আর চকচকে সেভ জিগপ্লাট" গুগল করে, তাই আমি আর একটি কাজের অবদান রাখব। খুব সাধারণ ... একই ফাংশনে কল করুন জিগਸੇভে যা আপনার গ্রাফটি প্রদর্শন করে যা গ্রাফটি সার্ভারে ফাইল হিসাবে সংরক্ষণ করবে।

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

তারপরে, ডাউনলোডহ্যান্ডলারটি ব্যবহার করুন এবং file.copy()বিদ্যমান ফাইল থেকে "ফাইল" পরামিতিতে ডেটা লিখতে ব্যবহার করুন।

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

আমার জন্য কাজ কর.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.