In answer to Viral's question the purpose of RCall.jl is to link to the R 
API directly from Julia instead of writing "glue" code in C.  I decided to 
do a clean room implementation rather than build on Rif.jl because I was 
(mistakenly) concerned about the license on Rif.jl

Some of the goals are:
 - use dep/build.jl to determine the location of libR.so and suitable 
values for various environment variables expected by R
 - reflect the internal structure of R objects in a templated Julia type.
 - provide easy access to data sets from R packages.  There is code to do 
this in DataFrames/src/RDA.jl but that depends upon reproducing the entire 
decoding mechanism for saved R objects in Julia.  I think the easier way to 
do this is to use R to decode its own save format and just pick up the 
values from R.  This will also provide an alternative to using the 
RDatasets package.
 - provide a reference implementation for the formula/data representation 
to produce ModelFrame and ModelMatrix objects.
 - allow access to R packages.

Ultimately I would like RCall to be as complete as PyCall but that would 
probably require participation by other more skilled than me.

On Tuesday, January 6, 2015 12:28:51 AM UTC-6, Randy Lai wrote:
>
> Hi all,
>
>
> Sorry for joining the game late, I have been very busy in the past few 
> days. 
>
>
>
> First of all, I am very excited to learn that RCall.jl is now alive at 
> JuliaStats. To resolve the confusion between the package names of my 
> original package and the one hosted on JuliaStats, I renamed my original 
> package and now it is called “RCalling.jl”. 
>
>
> https://github.com/randy3k/RCalling.jl
>
>
>
> I have a brief look of what Douglas have been doing in the new repo of 
> RCall.jl. 
>
> His direction in porting all R API functions from C to Julia may allow 
> further development of the R/Julia interface easier.
>
> In contrest, in RCalling.jl, I have been using the Julia API (in C) and R 
> API (of course, also in C) intensively, which actually make coding 
> difficult and hard to be maintained.
>
>
> It is good to have more people playing the game.
>
> Please let me know how I could be helping in the development of the 
> package.
>
>
> Best
>
>
> Randy
>
> On Friday, January 2, 2015 11:59:04 AM UTC-8, Douglas Bates wrote:
>>
>> For many statistics-oriented Julia users there is a great advantage in 
>> being able to piggy-back on R development and to use at least the data sets 
>> from R packages.  Hence the RDatasets package and the read_rda function in 
>> the DataFrames package for reading saved R data.
>>
>> Over the last couple of days I have been experimenting with running an 
>> embedded R within Julia and calling R functions from Julia. This is similar 
>> in scope to the Rif package except that this code is written in Julia and 
>> not as a set of wrapper functions written in C. The R API is a C API and, 
>> in some ways, very simple. Everything in R is represented as a "symbolic 
>> expression" or SEXPREC and passed around as pointers to such expressions 
>> (called an SEXP type).  Most functions take one or more SEXP values as 
>> arguments and return an SEXP.
>>
>> I have avoided reading the code for Rif for two reasons:
>>  1. It is GPL3 licensed
>>  2. I already know a fair bit of the R API and where to find API function 
>> signatures.
>>
>> Here's a simple example
>> julia> initR()
>> 1
>>
>> julia> globalEnv = unsafe_load(cglobal((:R_GlobalEnv,libR),SEXP),1)
>> Ptr{Void} @0x0000000008c1c388
>>
>> julia> formaldehyde = tryEval(install(:Formaldehyde))
>> Ptr{Void} @0x0000000008fd1d18
>>
>> julia> inherits(formaldehyde,"data.frame")
>> true
>>
>> julia> printValue(formaldehyde)
>>   carb optden
>> 1  0.1  0.086
>> 2  0.3  0.269
>> 3  0.5  0.446
>> 4  0.6  0.538
>> 5  0.7  0.626
>> 6  0.9  0.782
>>
>> julia> length(formaldehyde)
>> 2
>>
>> julia> names(formaldehyde)
>> 2-element Array{ASCIIString,1}:
>>  "carb"  
>>  "optden"
>>
>> julia> form1 = ccall((:VECTOR_ELT,libR),SEXP,(SEXP,Cint),formaldehyde,0)
>> Ptr{Void} @0x000000000a5baf58
>>
>> julia> ccall((:TYPEOF,libR),Cint,(SEXP,),form1)
>> 14
>>
>> julia> carb = 
>> copy(pointer_to_array(ccall((:REAL,libR),Ptr{Cdouble},(SEXP,),form1),length(form1)))
>> 6-element Array{Float64,1}:
>>  0.1
>>  0.3
>>  0.5
>>  0.6
>>  0.7
>>  0.9
>>
>> julia> form2 = ccall((:VECTOR_ELT,libR),SEXP,(SEXP,Cint),formaldehyde,1)
>> Ptr{Void} @0x000000000a5baef0
>>
>> julia> ccall((:TYPEOF,libR),Cint,(SEXP,),form2)
>> 14
>>
>> julia> optden = 
>> copy(pointer_to_array(ccall((:REAL,libR),Ptr{Cdouble},(SEXP,),form2),length(form2)))
>> 6-element Array{Float64,1}:
>>  0.086
>>  0.269
>>  0.446
>>  0.538
>>  0.626
>>  0.782
>>
>>
>> A call to printValue uses the R printing mechanism.
>>
>> Questions:
>>  - What would be a good name for such a package?  In the spirit of PyCall 
>> it could be RCall or Rcall perhaps.
>>
>>  - Right now I am defining several functions that emulate the names of 
>> functions in R itself ir in the R API.  What is a good balance?  Obviously 
>> it would not be a good idea to bring in all the names in the R base 
>> namespace.  On the other hand, those who know names like "inherits" and 
>> what it means in R will find it convenient to have such names in such a 
>> package.
>>
>> - Should I move the discussion the the julia-stats list?
>>
>>

Reply via email to