[R] can I call user-created functions without source() ?
Joerg van den Hoff
j.van_den_hoff at fz-rossendorf.de
Mon Jun 19 14:19:36 CEST 2006
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
More information about the R-help
mailing list