summaryrefslogtreecommitdiff
path: root/lib/r-util.rb
blob: 0d583897a46857e0783f5a1cfc5a1d68890658b3 (plain)
1
2
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# pending: package dir hack ---------
# CONFIG[:base_dir] = "/home/<user>/opentox-ruby/www"
# PACKAGE_DIR = "/home/<user>/opentox-ruby/r-packages"
package_dir = CONFIG[:base_dir].split("/")
package_dir[-1] = "r-packages"
package_dir = package_dir.join("/")
PACKAGE_DIR = package_dir



module Lib
  
  module RUtil
    
    def self.dataset_to_dataframe( dataset )
      LOGGER.debug "convert dataset to dataframe #{dataset.uri}"
      all_features = []
      dataset.features.each do |f|
        feat_name = "feature_#{f[0].split("/")[-1]}"
        LOGGER.debug "- adding feature: #{feat_name}"
        feat = OpenTox::Feature.find(f[0])
        nominal = feat.metadata[RDF.type].to_a.flatten.include?(OT.NominalFeature)
        values = []
        dataset.compounds.each do |c|
          val = dataset.data_entries[c][f[0]]
          raise "not yet implemented" if val!=nil && val.size>1
          v = val==nil ? "" : val[0].to_s
          v = "NA" if v.size()==0
          values << v
        end
        all_features << feat_name
        @@r.assign feat_name,values
        @@r.eval "#{feat_name} <- as.numeric(#{feat_name})" unless nominal
      end
      df_name = "df_#{dataset.uri.split("/")[-1].split("?")[0]}"
      cmd =  "#{df_name} <- data.frame(#{all_features.join(",")})"
      @@r.eval cmd
      #@@r.eval "head(#{df_name})"
      df_name
    end
    
    def self.stratified_split( dataframe, pct=0.3, seed=42 )
      @@r.eval "set.seed(#{seed})"
      @@r.eval "split <- stratified_split(#{dataframe}, ratio=#{pct})"
      split = @@r.pull 'split'
      split.collect{|s| s.to_i}
    end
    
    def self.package_installed?( package )
      @@r.eval ".libPaths(\"#{PACKAGE_DIR}\")"
      p = @@r.pull "installed.packages()[,1]"
      p.include?(package) 
    end
    
    def self.install_packages( package )
      unless package_installed? package
        @@r.eval "install.packages(\"#{package}\", repos=\"http://cran.r-project.org\", dependencies=T, lib=\"#{PACKAGE_DIR}\")"
      end
    end
    
    def self.library( package )
      install_packages( package )
      @@r.eval "library(\"#{package}\")"
    end
    
    def self.init_r
      @@r = RinRuby.new(true,false) unless defined?(@@r) and @@r
      library("sampling")
      library("gam")
      @@r.eval "source(\"#{PACKAGE_DIR}/stratification.R\")"
    end
    
    def self.quit_r
      begin
        @@r.quit
        @@r = nil
      rescue
      end
    end
    
  end
end