Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download

All published worksheets from http://sagenb.org

Views: 168758
Image: ubuntu2004

First, let's make simple analysis inside R. We have to use png drawing device and silent return value of dev.off function call, it's not necessary but reasonable thing to do.

%r x <- rnorm(100) y <- rnorm(100, mean=5)*x+rnorm(100, mean=0.1) png() plot(y ~ x) abline(lm(y ~ x), lwd=2) .silent.me. <- dev.off()

We will be accessing x and y inside Sage, so we need small interface functions on both R and Sage side:

%r letSage <- function(variable,value) { .GlobalEnv[[variable]]<-value } getSage <- function(variable) { return(.GlobalEnv[[variable]]) }
def setR(variable, value): def prepare(x): if isinstance(x, str): return '"%s"'%x elif isinstance(x, list): return map(prepare, x) else: return x r.letSage(prepare(variable), prepare(value)) def getR(variable): if isinstance(variable, str): return(sageobj(r.getSage('"%s"'%variable))) else: return map(getR, variable)

We create copies of R variables in Sage:

x = getR("x") y = getR("y") x[0:9]
[-0.95532848211007404, 0.22520393089409799, 0.69497116038785101, 1.1103934207403801, 1.06881750704875, -0.12758190055912999, 0.86809580969017297, -2.4568662537613699, -0.231569422766398]

We have to look out for starting indices on both sides!

%r x[1]
[1] -0.9553285
x[0]
-0.95532848211007404

Also, remember that those are copies of variables, not references!

x[0]=round(x[0],ndigits=2); x[0]
-0.96
%r x[1]
[1] -0.9553285

But of course we can copy those values back to R:

setR("x", x)
%r x[1]
[1] -0.96

That way, we can make a plot of same data using Sage plotting capabilities:

plot(points(zip(x,y)))

Or using "r-dot" interface:

r.png() r.plot(x, y) _=r.dev_off()

But remember that such call creates new variables named sage* inside Rs environment:

%r ls()
[1] "getSage" "letSage" "sage0" "sage1" "sage10" "sage100" "sage101" "sage102" "sage103" [10] "sage104" "sage105" "sage106" "sage107" "sage108" "sage109" "sage11" "sage110" "sage111" [19] "sage112" "sage113" "sage114" "sage115" "sage116" "sage117" "sage118" "sage119" "sage12" [28] "sage120" "sage121" "sage122" "sage123" "sage124" "sage125" "sage126" "sage127" "sage128" [37] "sage129" "sage13" "sage130" "sage131" "sage132" "sage133" "sage134" "sage135" "sage136" [46] "sage137" "sage138" "sage139" "sage14" "sage140" "sage141" "sage142" "sage143" "sage144" [55] "sage145" "sage146" "sage147" "sage148" "sage149" "sage15" "sage150" "sage151" "sage152" [64] "sage153" "sage154" "sage155" "sage156" "sage157" "sage158" "sage159" "sage16" "sage160" [73] "sage161" "sage162" "sage163" "sage164" "sage165" "sage166" "sage167" "sage168" "sage169" [82] "sage17" "sage170" "sage171" "sage172" "sage173" "sage174" "sage175" "sage176" "sage177" [91] "sage178" "sage179" "sage18" "sage180" "sage181" "sage182" "sage183" "sage184" "sage185" [100] "sage186" "sage187" "sage188" "sage189" "sage19" "sage190" "sage191" "sage192" "sage193" [109] "sage194" "sage195" "sage196" "sage197" "sage198" "sage199" "sage2" "sage20" "sage200" [118] "sage201" "sage202" "sage21" "sage22" "sage23" "sage24" "sage25" "sage26" "sage27" [127] "sage28" "sage29" "sage3" "sage30" "sage31" "sage32" "sage33" "sage34" "sage35" [136] "sage36" "sage37" "sage38" "sage39" "sage4" "sage40" "sage41" "sage42" "sage43" [145] "sage44" "sage45" "sage46" "sage47" "sage48" "sage49" "sage5" "sage50" "sage51" [154] "sage52" "sage53" "sage54" "sage55" "sage56" "sage57" "sage58" "sage59" "sage6" [163] "sage60" "sage61" "sage62" "sage63" "sage64" "sage65" "sage66" "sage67" "sage68" [172] "sage69" "sage7" "sage70" "sage71" "sage72" "sage73" "sage74" "sage75" "sage76" [181] "sage77" "sage78" "sage79" "sage8" "sage80" "sage81" "sage82" "sage83" "sage84" [190] "sage85" "sage86" "sage87" "sage88" "sage89" "sage9" "sage90" "sage91" "sage92" [199] "sage93" "sage94" "sage95" "sage96" "sage97" "sage98" "sage99" "x" "y"

There is also one thing to look out for, passing strings. If you pass strings as it, using "value", expect to get something like:

r.png() r.plot(x, y, xlab="x", ylab="y") _=r.dev_off()

or:

r.png() r.plot(x, y, xlab="the x", ylab="the y") _=r.dev_off()

To get the names, you have to quote the quotes, so use '"value"' or "'value'" like in:

r.png() r.plot(x, y, xlab='"x"', ylab="'y'") _=r.dev_off()

It's not much, but actually it is enough to get you started if you already know R and want to use it from Sage.