Re: [R] can I call user-created functions without source() ?

From: Joerg van den Hoff <j.van_den_hoff_at_fz-rossendorf.de>
Date: Mon 19 Jun 2006 - 22:19:36 EST

Duncan Murdoch wrote:

> On 6/19/2006 6:25 AM, (Ted Harding) wrote:

>> On 19-Jun-06 Rob Campbell wrote:
>>> Hi,
>>>
>>> I have to R fairly recently from Matlab, where I have been used to
>>> organising my own custom functions into directories which are adding to
>>> the Matlab search path. This enables me to call them as I would one of
>>> Matlab's built-in functions. I have not found a way of doing the same
>>> thing in R. I have resorted to using source() on symlinks located in
>>> the
>>> current directory. Not very satisfactory.
>>>
>>> I looked at the R homepage and considered making a "package" of my
>>> commonly used functions so that I can call them in one go:
>>> library(myFuncions, lib.loc="/path/to/library") Perhaps this is the
>>> only
>>> solution but the docs on the web make the process seem rather
>>> complicated--I only have a few script files I want to call! Surely
>>> there's a straightforward solution?
>>>
>>> How have other people solved this problem? Perhaps someone has a simple
>>> "package skeleton" into which I can drop my scripts?
>>>
>>>
>>> Thanks,
>>>
>>> Rob
>> There are pros and cons to this, but on the whole I sympathise
>> with you (having pre-R been a heavy matlab/octave user myself).
>>
>> Unfortunately (from this perspective) R does not seem to have
>> an automatic "load-on-demand" facility similar to what happens
>> in matlab (i.e. you call a function by name, and R would search
>> for it in whatever the current search-path is, and load its
>> definition plus what else it depends on).
>>
>> I have a few definitions which I want in every R session, so
>> I have put these in my ".Rprofile". But this is loaded from
>> my home directory, not from the directory where I was when I
>> started R, so it is the same every time.
> 
> Which version of R are you using?  This is not the current documented 
> behaviour.  It looks in the current directory first, and only in your 
> home directory if that fails.
> 
> Duncan Murdoch
> 
> 
> Again, one of the

>> conveniences of the matlab/octave approach is that you can
>> have a different sub-directory for each project, so if you
>> start work in a particular one then you have access to any
>> special definitions for that project, and not to others.
>>
>> I'm no expert on this aspect of R, but I suspect that the way
>> start-up is organised in R does not fit well with the other
>> kind of approach. I stand to be corrected, of course ...
>>
>> And others may well have formulated their own neat work-rounds,
>> so we wait eagerly to hear about these!
>>
>> Best wishes,
>> Ted.
>>

using `package.skeleton' (as already mentioned) for the package dir layout and `prompt' for generating templates of the needed manpages is not so bad (once you get used to it), if the things you have in mind are at least of some long(er) term value (for you): at least you are forced (sort of) to document your software...

for short term usage of some specialized functions I have added some lines to the `.Rprofile' in my home(!) directory as follows (probably there are smarter solutions, but at least it works):

#source some temporary useful functions: fl <- dir(path='~/rfiles/current',patt='.*\\.R$',full.names=TRUE) for (i in fl) {cat(paste('source("',i,'")\n',sep="")); source(i)} rm(i,fl)

here, I have put all the temporary stuff in a single dedicated dir `~/rfiles/current', but of course you can use several dirs in this way. all files in this dir with names ending in `.R' are sourced on startup of R. this roughly works like one of the directories on MATLAB's search path: every function definition in this directory is 'understood' by R (but everything is loaded into the workspace on startup, no matter, whether you really need it in the end: no real `load on demand'). one important difference, though: this is only sensible for function definitions, not scripts ('executable programms' (which would directly be executed on R startup, otherwise).
and, contrary to matlab/octave, this is not dynamic: everything is read in at startup, later modifications to the directories are not recognized without explicitely sourcing the files again.

if you in addition you want to load definitions from the startup directory where you launch R (your project dir), the above could be modified to:

#source some temporary useful functions from startup dir: fl <- dir(path=getwd(),patt='.*\\.R$',full.names=TRUE) for (i in fl) {cat(paste('source("',i,'")\n',sep="")); source(i)} rm(i,fl)

in this way you at least don't need a separate `.Rprofile' in each project dir.

joerg



R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html Received on Mon Jun 19 22:23:50 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Tue 20 Jun 2006 - 00:11:09 EST.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.