Rtcl is a Tcl extension for executing code in the R [L1 ] programming language. R is a free version of Bell Labs' S language for statistical computing. Rtcl embeds an R interpreter into Tcl, and allows access to it via Tcl commands. The latest version of Rtcl is available from
https://github.com/mattadams/Rtcl
Rtcl was originally written by Neil McKay. His last published version is available from
http://www.eecs.umich.edu/~mckay/computer/Rtcl0.3.tar.gz
TR I have successfully compiled and used the package on macOS Catalina (10.15.7), using Rtcl version 1.2.1. R version 4.0.4 is installed and lives under /Library/Frameworks/R.framework/Resources. This is the directory returned by
R RHOME
Compiling Rtcl using just with ./configure; make; make install works. However, I am getting the error message cannot load libR from the Rtcl package when I do package require Rtcl. This is because Rtcl cannot find the installed R. First, the R_HOME environment variable is not set by R, so the initialization script in Rtcl cannot use it. Second, the paths to R hard-coded into Rtcl do not match my installation, so Rtcl cannot find R at that place either. It doesn't help much to add the correct path in Rtcl's init code. This will help loading the library in Tcl but then R fails with saying cannot find system Renviron. It turns out that the easy solution is to just define the R_HOME environment variable and set it to the output of R RHOME. Depending on your setup, you can just put it into your profile:
export R_HOME=`R RHOME`
You could also include it into the pkgIndex.tcl file of Rtcl, before the actual libRtcl1.2.1.dylib library is loaded, e.g.:
set env(R_HOME) [exec /usr/local/bin/R RHOME] package ifneeded Rtcl 1.2.1 \ [list load [file join $dir libRtcl1.2.1.dylib] Rtcl]
The package provides four new commands in the rtcl namespace:
::rtcl::eval ?-verbose? R Expression(s) ::rtcl::source ?-verbose? foo.R ::rtcl::gettype ?-verbose? R Expression(s) ::rtcl::getvalue ?-verbose? R Expression(s)
Here's an example output from the console:
% package require Rtcl 1.2.1 % # the following will just execute some R code without returning anything: % ::rtcl::eval "a <- c(1:10)" % # if you want to see the content of 'a', you need: % ::rtcl::getvalue a 1 2 3 4 5 6 7 8 9 10 % # getvalues does also execute the command, so you can do both in one step: % ::rtcl::getvalue "a <- c(1:10)" 1 2 3 4 5 6 7 8 9 10 % # loading R libraries works as usual: % ::rtcl::eval library(sf) % we can transfer data to R and get results back like this: % set x 5 % set result [::rtcl::getvalue "$x * $x"] % 25.0 % puts $result 25.0 % note, that Rtcl returned a 'real' value: % ::rtcl::gettype "$x * $x" real % ... when doing this in plain R, you will get "25" and 'class(5*5)' will return only 'numeric', so 'real' is the safe choice ...