Interfaces/R/DCOM
The DCOM interface allows R to be called from J using Windows COM.
Installation
1. Install R in the usual way, then install the R (D)COM package from CRAN dcom directory.
(An alternative may be to install from the R command line, using install.packages("rcom") - however, this has given errors when trying to load the server from J.)
2. Install the stats/r addon.
3. Load J, then:
load 'stats/r/rdcom' '' conew 'prdcom' 0 ". Rcmdr 'rnorm(1)' _0.464262
Methods
Methods are defined in z with names beginning R, for example Rcmd. These in turn call verbs in the connection locale, named without the R, for example Rcmd calls cmd in the connection locale.
Only a few basic methods are defined. It should be easy to extend these as required. Each method sends its argument as a command to R.
The methods are:
Rcmd - send command, ignore any output
Rcmdr - send command, return only command output
Rcmdx - send command, return extended output
Examples
Example of setting values then calling an R routine using those values:
Rcmd 'x = 1:5' Rcmd 'y = c(2,3,5,7,11)' Rcmdx 'lsfit(x,y)' $coefficients Intercept X -1.0 2.2 $residuals [1] 0.8 -0.4 -0.6 -0.8 1.0 $intercept [1] TRUE $qr $qt [1] -12.5219807 6.9570109 -0.9600727 -1.3426824 0.2747078 $qr Intercept X [1,] -2.2360680 -6.7082039 [2,] 0.4472136 3.1622777 [3,] 0.4472136 -0.1954395 [4,] 0.4472136 -0.5116673 [5,] 0.4472136 -0.8278950 ...
Using Rcmdr in the following example gives an error, since the value has no COM representation. Instead use Rcmdx to retrieve the value.
Rcmd 'x <- c(1,2,3,4)' Rcmd 'y <- c(2,3,5,7)' Rcmd 'z <- lm(y~x)' Rcmdr 'z' Šdomain error: wd Š r=.r,LF, wd'olemethod w base Evaluate *',>c Rcmdx 'z' Call: lm(formula = y ~ x) Coefficients: (Intercept) x 1.110e-16 1.700e+00
This is equivalent to using a sink to get the value:
Rcmd 'sink(file="c:/r.txt",append=TRUE,type="output")' Rcmd 'print(z)' Rcmd 'sink(file=NULL)' fread 'c:/r.txt' Call: lm(formula = y ~ x) Coefficients: (Intercept) x 1.110e-16 1.700e+00
The next examples show and set the working directory:
Rcmdr 'getwd()' C:/WINDOWS/system32 Rcmd 'setwd ("c:/program files/r/r-2.2.0")' Rcmdr 'getwd()' c:/program files/r/r-2.2.0
Example of function definition:
Rcmd 'g <- function(x,y) {x + 2 * y}' Rcmdr 'typeof(g)' closure Rcmdr 'g(5,3)' 11
Similar example, but with LF-delimited text. In this case, box the command to avoid a cut on LF:
Rcmd <'g <- function(x,y) {',LF,'a <- x',LF,'a + 2 * y}' Rcmdr 'g(10,20)' 50
Several commands may be given at once:
Rcmdx 'a=c(2,3,5,7);b=a[1];c=10 + b;c;' [1] 12
The R server can generate a plot:
Rcmd 'plot(c(1,2,3,5,7,11),type="l")'
Source Code
The source code is in the public subversion respository, subdirectory r/dcom.