[R] How to find the path or the current file?

Wacek Kusnierczyk Waclaw.Marcin.Kusnierczyk at idi.ntnu.no
Wed Mar 25 14:59:46 CET 2009


Wacek Kusnierczyk wrote:
> hacking up on gabor's solution, i've created a trivial function that
> will allow you to access a file given a path relative to the path of the
> file calling the function.
>
> to be concrete, suppose you have two files -- one library and one
> executable -- located in two sibling directories, and you want one of
> them to access (e.g., source) the other without the need to specify the
> absolute path, and irrespectively of the current working directory. 
> here is a simple example.
>
>     mkdir foo/{bin,lib} -p
>    
>     echo '
>        # the library file
>        foo = function() cat("foo\n")
>     ' > foo/lib/lib.r
>
>     echo '
>        # the executable file
>        source("http://miscell.googlecode.com/svn/rpath/rpath.r")
>        source(rpath("../lib/lib.r"))
>        foo()
>     ' > foo/bin/bin.r
>   

one thing i forgot to add:  that contrarily to what gabor warned about
his solution, you don't have to have the call to rpath at the top level,
and can embed it in nested nevironments or calls; thus, the following
executable:

    echo '
       # the executable file
       source("http://miscell.googlecode.com/svn/rpath/rpath.r")
       (function()
          (function()
             (function() {
                source(rpath("../lib/lib.r"))
                foo() })())())()
    ' > foo/bin/bin.r

will still work as below.

> now you can execute foo/bin/bin.r from whatever location, or source it
> in r within whatever working directory, and still have it load
> foo/lib/lib.r:
>
>     r foo/bin/bin.r
>     # foo
>
>     (cd foo; r bin/bin.r)
>     # foo
>
>     r -e 'source("foo/bin/bin.r")'
>     # foo
>
>     (cd foo/bin; r -e 'source("bin.r")')
>     # foo
>
> so the trick for you is to source rpath, and voila.  (note, it's not
> foolproof;  as duncan explained, such approach may not work in some
> circumstances.)
>
> does this address your problem?
>
> hilsen,
> vQ
>
> Gabor Grothendieck wrote:
>   
>> See:
>>
>> https://stat.ethz.ch/pipermail/r-help/2009-January/184745.html
>>
>> On Tue, Mar 24, 2009 at 7:16 AM, Marie Sivertsen <mariesivert at gmail.com> wrote:
>>   
>>     
>>> Dear useRs,
>>>
>>> I have a collection of source file and some of these call others.  The files
>>> are distribute among a number of directories, and to know how to call some
>>> other file they need to know what file is currently executed.
>>>
>>> As example, I have a file 'search.R' located in directory 'bin' which needs
>>> to access the file 'terms.conf' located in the directory 'conf', a sibling
>>> of 'bin'.  I can have somethings like readLines('../conf/terms.conf') in
>>> search.R, but this work only if search.R is executed from bin, when getwd is
>>> 'bin'.  But when search.R calls from the parent as bin/search.R or any other
>>> derectory then R complains that it could not find the file
>>> '../conf/terms.conf'.
>>>
>>> So my questions is:  how can the file search.R, when executied, discover its
>>> own location and load terms.conf from <location of
>>> search.R>/../conf/terms.conf?  the location of search.R can be unrelated to
>>> the current directory.
>>>
>>> Mvh.
>>> Marie




More information about the R-help mailing list