Module: R::SVG

Defined in:
lib/rbbt/util/R/plot.rb

Class Method Summary collapse

Class Method Details

.ggplotSVG(data, script = nil, width = nil, height = nil, options = {}) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/rbbt/util/R/plot.rb', line 3

def self.ggplotSVG(data, script = nil, width = nil, height = nil, options = {})
  width ||= 3
  height ||= 3
  values = []

  options = options.dup

  sources = [:plot, Rbbt.share.Rlib["svg.R"].find(:lib), options[:source]].flatten.compact
  options.delete :source

  if data
    data.each do |k,v|
      v = Array === v ? v : [v]
      next if v == "NA" or v.nil? or v.include? "NA" or v.include? nil
      values = v
      break
    end
    values = [values] unless Array === values
    field_classes = values.collect do |v| 
      case v
      when FalseClass, TrueClass
        "'logical'"
      when Fixnum, Float
        "'numeric'"
      when String
        if v.strip =~ /^[-+]?[\d\.]+$/
          "'numeric'"
        else
          "'character'"
        end
      when Symbol
        "'factor'"
      else
        ":NA"
      end
    end
    options[:R_open] ||= "colClasses=c('character'," + field_classes * ", " + ')'

    TmpFile.with_file nil, true, :extension => 'svg' do |tmpfile|
      data.R <<-EOF, sources, options
  plot = { #{script} }

  rbbt.SVG.save('#{tmpfile}', plot, width = #{R.ruby2R width}, height = #{R.ruby2R height})
  data = NULL
      EOF
    Open.read(tmpfile).gsub(/(glyph\d+-\d+)/, '\1-' + File.basename(tmpfile))
    end
  else

    TmpFile.with_file nil, true, :extension => 'svg' do |tmpfile|
      R.run <<-EOF, sources, options
  plot = { #{script} }

  rbbt.SVG.save('#{tmpfile}', plot, width = #{R.ruby2R width}, height = #{R.ruby2R height})
  data = NULL
      EOF
      Open.read(tmpfile).gsub(/(glyph\d+-\d+)/, '\1-' + File.basename(tmpfile))
    end
  end
end