Module: Rserve

Defined in:
lib/R4rb/Rserve.rb

Overview

IMPORTANT, no use of R4rb tools! R2rb or Rserve mode only!

Defined Under Namespace

Classes: RVector

Class Method Summary collapse

Class Method Details

.<(code) ⇒ Object



145
146
147
# File 'lib/R4rb/Rserve.rb', line 145

def Rserve.<(code)
	Rserve.output(code)
end

.<<(code) ⇒ Object



131
132
133
# File 'lib/R4rb/Rserve.rb', line 131

def Rserve.<<(code)
	Rserve.eval(code)
end

.assign(code, var = nil, cli = nil) ⇒ Object



149
150
151
152
153
154
155
156
# File 'lib/R4rb/Rserve.rb', line 149

def Rserve.assign(code,var=nil,cli=nil)
	code+=",quote(#{var})" if var
	cli=Rserve.cli unless cli
	code="RSassign(#{cli},#{code})"
	#p code
	#R2rb << code ###????
	Rserve << code
end

.cliObject

the two following methods to be possibly redefined in particular inside Dyndoc to automatically allocate the R session related to the user!



48
49
50
# File 'lib/R4rb/Rserve.rb', line 48

def Rserve.cli
	@@cli
end

.cli=(cli) ⇒ Object



52
53
54
# File 'lib/R4rb/Rserve.rb', line 52

def Rserve.cli=(cli)
	@@cli=cli
end

.client(cli = nil) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/R4rb/Rserve.rb', line 58

def Rserve.client(cli=nil)
	## automate the init process!
	#Rserve.init unless @@clients

	##return current client!
	unless cli 	
		return Rserve.cli
	## create a new client
	else 		
		Rserve.open(cli)
	end
end

.client=(cli = nil) ⇒ Object

change the current client!



72
73
74
75
# File 'lib/R4rb/Rserve.rb', line 72

def Rserve.client=(cli=nil)
	return nil unless @@clients.include? cli
	Rserve.cli=cli
end

.close(cli = nil) ⇒ Object



83
84
85
86
87
88
# File 'lib/R4rb/Rserve.rb', line 83

def Rserve.close(cli=nil) 
	cli=Rserve.cli unless cli
	return unless @@clients.include? cli
	"RSclose(#{cli.to_s})".R2rb
	@@clients.delete(cli)
end

.complete_code!(code) ⇒ Object

interface



96
97
98
99
100
# File 'lib/R4rb/Rserve.rb', line 96

def Rserve.complete_code!(code)
	code.gsub!("\\","\\\\")
	code.gsub!("\"","\\\"")
	code.replace("RSeval(#{cli},\"capture.output({"+code+"})\")")
end

.completed_code(code, capture = true) ⇒ Object



103
104
105
106
# File 'lib/R4rb/Rserve.rb', line 103

def Rserve.completed_code(code,capture=true)
	open,close= (capture ? ["capture.output({","})"] : ["",""])
	"RSeval(#{cli},\""+open+code.gsub("\\","\\\\").gsub("\"","\\\"")+close+"\")"
end

.eval(code, cli = nil) ⇒ Object



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/R4rb/Rserve.rb', line 108

def Rserve.eval(code,cli=nil)
	cli=Rserve.cli unless cli
	return nil unless cli
	## check parsing locally (without RSeval)
	status=R2rb.parse code
	if status!=1
		R2rb.parse code,true
		return false
	end
	## RSeval completed in code!
	Rserve.complete_code!(code)
	#puts "Rserve.eval:";p code
	R2rb.eval code
	#@@out < code ##@@out.inR2rb code # since @@out < code but for R2rb
end

.initObject



32
33
34
35
36
37
38
39
40
41
42
# File 'lib/R4rb/Rserve.rb', line 32

def Rserve.init
	#puts "Rserve.init"
	Array.initR
	#puts "Rserve.init2"
	"require(Rserve)".R2rb
	#puts "Rserve.init3"
	@@clients,@@cli=[],nil
	@@out=[]
	@@out.rb2R=R2rb
	#puts "Rserve.init4"
end

.lsObject



90
91
92
# File 'lib/R4rb/Rserve.rb', line 90

def Rserve.ls
	@@clients
end

.open(cli) ⇒ Object



77
78
79
80
81
# File 'lib/R4rb/Rserve.rb', line 77

def Rserve.open(cli)
	"#{cli.to_s} <- RSconnect()".R2rb
	@@clients << cli
	Rserve.cli=cli
end

.output(code, cli = nil) ⇒ Object



135
136
137
138
139
140
141
142
143
# File 'lib/R4rb/Rserve.rb', line 135

def Rserve.output(code,cli=nil)
	#puts "Rserve.output:";p code
	cli=Rserve.cli unless cli
	return nil unless cli
	## RSeval completed in code!
	Rserve.complete_code!(code)
	@@out < code ##@@out.inR2rb rcode.to_s
   	return (@@out.length<=1 ? @@out[0] : @@out)
end

.pidObject

server side



7
8
9
# File 'lib/R4rb/Rserve.rb', line 7

def Rserve.pid
	`ps -C Rserve -o pid=`.strip
end

.running?Boolean

Returns:

  • (Boolean)


11
12
13
# File 'lib/R4rb/Rserve.rb', line 11

def Rserve.running?
	!Rserve.pid.empty?
end

.start(rserve = File.expand_path("~/bin/Rserv")) ⇒ Object



15
16
17
# File 'lib/R4rb/Rserve.rb', line 15

def Rserve.start(rserve=File.expand_path("~/bin/Rserv"))
	`R CMD #{rserve}` unless Rserve.running?
end

.stopObject



20
21
22
23
24
25
26
27
# File 'lib/R4rb/Rserve.rb', line 20

def Rserve.stop
		pid=Rserve.pid
	`kill #{pid}` unless pid.empty?
	sleep(2)
	if Rserve.running?
		puts "Sorry! but the Rserver is still running!"
	end
end

.try_eval(code, cli = nil) ⇒ Object



124
125
126
127
128
129
# File 'lib/R4rb/Rserve.rb', line 124

def Rserve.try_eval(code,cli=nil)
		cli=Rserve.cli unless cli
 	try_code=".result_try_code<-try({\n"+code+"\n},silent=TRUE)\n"
 	puts Rserve.output(try_code,cli).join("\n")
 	puts R2rb.output(Rserve.completed_code(".result_try_code",false)) if "inherits(.result_try_code,'try-error')".to_R
end