Module: Renjin::Index

Included in:
List, Sequence, Vector
Defined in:
lib/JRubyR/rbsexp.rb

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(symbol, *args) ⇒ Object





83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/JRubyR/rbsexp.rb', line 83

def method_missing(symbol, *args)
  
  name = symbol.id2name
  name.gsub!(/__/,".")
  
  # super if args.length != 0
  if name =~ /(.*)=$/
    super if args.length != 1
    # p "#{r}$#{$1} = #{args[0].r}"
    # ret = R.eval("#{r}[\"#{name}\"] = #{args[0].r}")
    ret = R.eval("#{r}$#{$1} = #{args[0].r}")
  elsif (name == "_")
    method = "%#{args.shift.to_s}%"
    arg2 = R.parse(*args)
    ret = R.eval("#{r} #{method} #{arg2}")
  elsif (args.length == 0)
    # treat name as a named item of the list
    if (R.eval("\"#{name}\" %in% names(#{r})").gt)
      ret = R.eval("#{r}[[\"#{name}\"]]")
    else
      ret = R.eval("#{name}(#{r})") if ret == nil 
    end
  elsif (args.length > 0)
    # p "#{name}(#{r}, #{R.parse(*args)})"
    ret = R.eval("#{name}(#{r}, #{R.parse(*args)})")
  else
    raise "Illegal argument for named list item #{name}"
  end
  
  ret
  
end

Instance Method Details

#[](*index) ⇒ Object





38
39
40
41
# File 'lib/JRubyR/rbsexp.rb', line 38

def [](*index)
  index = parse(index)
  R.eval("#{r}[#{index}]")
end

#[]=(*index, value) ⇒ Object





47
48
49
50
51
# File 'lib/JRubyR/rbsexp.rb', line 47

def []=(*index, value)
  index = parse(index)
  value = R.parse(value)
  R.eval("#{r}[#{index}] = #{value}")
end

#each(&block) ⇒ Object





128
129
130
131
132
# File 'lib/JRubyR/rbsexp.rb', line 128

def each(&block)
  while (@iterator.hasNext())
    block.call(@iterator.next())
  end
end

#lengthObject





120
121
122
# File 'lib/JRubyR/rbsexp.rb', line 120

def length
  R.length(R.eval("#{r}")).gz
end

#parse(index) ⇒ Object





57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/JRubyR/rbsexp.rb', line 57

def parse(index)

  params = Array.new

  index.each do |i|
    if (i.is_a? Array)
      params << i
    else
      params << R.parse(i)
    end
  end
  
  ps = String.new
  params.each_with_index do |p, i|
    ps << "," if i > 0
    ps << ((p == "NULL")? "" : p.to_s)
  end

  ps

end