Interfaces/R/Rserver/Examples
Open Connection
To explicitly open the connection, use verb Ropen. This is not required, as any other call will open the connection if necessary:
Ropen '' 0 Rget 'pi' 3.14159
Array Shape
The R shape order is preserved (arrays are in column-major order):
Rget 'matrix(1:6,2,3)' 1 3 5 2 4 6 $ Rget 'array(1:6,c(2,3,4,5))' 5 4 2 3
The following expression flips J arrays into R order:
rflip=: _2 |: |.@$ $ , (rflip 1 + i.2 3 4) -: Rget 'array(1:24,c(2,3,4))' 1
rflip is defined in locale rserver.
Attribute Lists
R data can have attributes. The J/R interface returns these in one of two formats.
For example:
Rcmd 'x=factor(c("one","two","three","four"))' Rget 'x' NB. return map ┌───────┬────────────────────┐ │`class │factor │ ├───────┼────────────────────┤ │`data │2 4 3 1 │ ├───────┼────────────────────┤ │`levels│┌────┬───┬─────┬───┐│ │ ││four│one│three│two││ │ │└────┴───┴─────┴───┘│ └───────┴────────────────────┘ Rgetexp 'x' NB. return SEXP ┌────────────────────────────────────────────┬───────┐ │┌────────────────────┬───────┬──────┬──────┐│2 4 3 1│ ││┌────┬───┬─────┬───┐│`levels│factor│`class││ │ │││four│one│three│two││ │ │ ││ │ ││└────┴───┴─────┴───┘│ │ │ ││ │ │└────────────────────┴───────┴──────┴──────┘│ │ └────────────────────────────────────────────┴───────┘
Booleans
R has TRUE=1, FALSE=0, and NA=2:
Rget 'c(TRUE,FALSE,NA,TRUE,TRUE,FALSE)' 1 0 2 1 1 0
Command Results
Rcmd evaluates the command only, while Rget evaluates a command and also returns the result.
Rcmd 'x=array(1:8,c(2,4))' NB. cmd = evaluate only Rget 'x*10' NB. get = evaluate and return 10 30 50 70 20 40 60 80
Function Definition
Function definition is by assignment, as in J:
Rcmd 'foo <- function(x,y) {x + 2 * y}' Rget 'typeof(foo)' closure Rget 'foo(5,3)' 11 Rgetexp 'foo' ┌┬──┬┬──┬─────────────────┐ ││`x││`y│┌─┬─────────────┐│ ││ ││ ││{│┌─┬─┬───────┐││ ││ ││ ││ ││+│x│┌─┬─┬─┐│││ ││ ││ ││ ││ │ ││*│2│y││││ ││ ││ ││ ││ │ │└─┴─┴─┘│││ ││ ││ ││ │└─┴─┴───────┘││ ││ ││ │└─┴─────────────┘│ └┴──┴┴──┴─────────────────┘
NA Value
R has a NA value, that has no J equivalent. It is convenient to define a noun in J for this purpose. The default value used is __ (negative infinity):
Rget 'c(1,2,Inf,-Inf,NaN,NA)' 1 2 _ __ _. __
Scalars
R has no scalars, and treats single numbers and characters as 1-element lists:
Rcmd 'x = c("a","b","c","d","e","f","g","h")' Rcmd 'dim(x) = c(2,4)' Rget 'x' NB. note boxed result ┌─┬─┬─┬─┐ │a│c│e│g│ ├─┼─┼─┼─┤ │b│d│f│h│ └─┴─┴─┴─┘ Rcmd 'x = c("abc","b","c","d","e","fore","g","h")' Rcmd 'dim(x) = c(2,4)' Rget 'x' ┌───┬─┬────┬─┐ │abc│c│e │g│ ├───┼─┼────┼─┤ │b │d│fore│h│ └───┴─┴────┴─┘
Rset
Rset works with simple data values. It cannot be used to send attributes other than the shape, which is handled automatically by the interface.
Rget 'abc' [ 'abc' Rset 'qwerty' qwerty Rget 'abc' [ 'abc' Rset i.2 3 0 1 2 3 4 5 'x' Rset 12 18 24 30 36 42 48 'y' Rset 5.27 5.68 6.25 7.21 8.02 8.71 8.42 Rcmd 'lxy=lsfit(x,y)' Rget 'lxy$coefficients' ┌─────────┬────────┐ │Intercept│3.99429 │ ├─────────┼────────┤ │X │0.102857│ └─────────┴────────┘ Rget 'lxy$residuals' 0.0414286 _0.165714 _0.212857 0.13 0.322857 0.395714 _0.511429
R Session output
You can capture the output of an R command to the R session as follows:
Rcmd 'library(MASS)' Rcmd 'res <- lm(data=iris, Sepal.Width ~ Petal.Width)' LF joinstring Rget 'capture.output(summary(res))' Call: lm(formula = Sepal.Width ~ Petal.Width, data = iris) Residuals: Min 1Q Median 3Q Max -1.09907 -0.23626 -0.01064 0.23345 1.17532 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 3.30843 0.06210 53.278 < 2e-16 *** Petal.Width -0.20936 0.04374 -4.786 4.07e-06 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 0.407 on 148 degrees of freedom Multiple R-squared: 0.134, Adjusted R-squared: 0.1282 F-statistic: 22.91 on 1 and 148 DF, p-value: 4.073e-06