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
[[alternative HTML version deleted]]
On 24/03/2009 7:16 AM, Marie Sivertsen 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.In general it can't. Since source() can work on a connection and a connection doesn't have to be a file, there may not be a location. You could write your own Source function, something like this: filenamestack <- c() Source <- function(filename, ...) { # push the new filename filenamestack <<- c(filename, filenamestack) # on exit pop it off the stack on.exit(filenamestack <<- filenamestack[-1]) source(filename, ...) } and then examine filenamestack[1] to find the name of the file currently being sourced. (But Source() won't work on connections, only on filenames.) Duncan Murdoch
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 > > ? ? ? ?[[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >
I sometimes deal with this problem by putting all the
scripts into a package (in the inst/ directory if they
don't fit elsewhere, perhaps in demo/) and then have
them all use system.file(package="myPkg",...) to locate
the related files. E.g.,
terms.conf <-
system.file(package="myPkg","conf","terms.conf")
if (terms.conf=="")
stop("Cannot find " ,
file.path("conf","terms.conf"), " in
package ", "myPkg")
source(terms.conf)
(It would be nice if system.file itself had an option
to halt if no file could be found but one can write a wrapper
for that.)
Putting all the scripts in a package also makes them easier
to deploy on other machines. By using the Depends: line
in the DESCRIPTION file you can arrange for packages to
have a core set of scripts available in a standard place.
Bill Dunlap
TIBCO Software Inc - Spotfire Division
wdunlap tibco.com
--------------------------------------------------------
[R] How to find the path or the current file?
Marie Sivertsen mariesivert at gmail.com
Tue Mar 24 12:16:22 CET 2009
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