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