Interfaces/R/Rserver/Examples

From J Wiki
Jump to: navigation, search
Rserver | Methods | Formats | Examples | Quirks

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