[R] Genuine relative paths with R

William Dunlap wdun|@p @end|ng |rom t|bco@com
Wed Oct 10 17:25:26 CEST 2018


I am curious about why it is desirable for a script to know where in the
file system it is.  Is it because you have a set of scripts invoking each
other?  If so, the best route it to convert the scripts into functions and
put them into a package.  Functions do know which package they live in and
they "prefer" to call other functions in their own package (or other
packages which they have declared).

Or is there some other reason?


Bill Dunlap
TIBCO Software
wdunlap tibco.com

On Wed, Oct 10, 2018 at 8:18 AM, Olivier GIVAUDAN <
olivier_givaudan using hotmail.com> wrote:

> Hi Duncan,
>
> Yes, if you need to display the content of $PWD you obviously need to type
> 'echo' before this variable.
>
> It prints the user's working directory if run from a terminal but if run
> from a bash file it prints the working directory of the script.
> At least for me (I am running on the last version of Ubuntu)...
>
> Best regards,
>
> Olivier
> ________________________________
> De : Duncan Murdoch <murdoch.duncan using gmail.com>
> Envoyé : mercredi 10 octobre 2018 14:51
> À : Olivier GIVAUDAN; Jeff Newmiller
> Cc : r-help using r-project.org
> Objet : Re: [R] Genuine relative paths with R
>
> On 10/10/2018 10:37 AM, Olivier GIVAUDAN wrote:
> > Hi Jeff,
> > ​
> >> That is, there is not always a file in a particular directory even
> involved in the executing code.​​
> > ​
> > True. I'm only asking in the case where some R code is run from an R
> file. This function 'MyOwnPath()' (say) should only work (i.e. return a
> useful result) in this case.​
> > ​
> >> The R interpreter does not make assumptions about where the code it is
> running came from.​
> > ​
> > That's precisely the reproach I have in case the code comes from a file.​
> > ​
> >> You also keep referring to "this feature" being in many languages,
> though you seem to be mistaken about most of them...​
> > ​
> > 'Most of them' is largely exaggerated (plus I corrected myself): I only
> mixed between the 'cd' variable / command in Windows and Linux shells (you
> would certainly agree it's a bit vicious).​
> > ​
> >> $PWD is the same as getwd()​
> > ​
> > Wrong. As I already said, if I create an R script located somewhere on
> my computer with the only line 'getwd()' and run this script, I won't get
> the directory of this R script, contrary to a shell file with the only line
> '$PWD'.​
>
> What system are you talking about?  On Unix-alikes, you'd need an "echo"
> ahead of that, and it would print the user's working directory, not the
> working directory of the script.
>
> Duncan Murdoch
>
> > ​
> >> __FILE__ in C relates to the source code directory that is usually not
> where the executable is ​located and may not even exist on the computer it
> is running on​
> > ​
> > Yes, and? What is the issue here? So '__FILE__' does the job. Invoking
> '__FILE__' in a .C file (I never said in its related executable) will
> return the absolute path of this C source file.​
> > '__DIR__' in PHP also does the job. No to forget the good old VBA (Excel
> in this case) 'ActiveWorkbook.Path'.​
> >
> > Thank you for the 2 references you provided.
> > However it seems that some manual settings are still required to be able
> to use Rscript.
> > But I like the solution of the .RData file: I simply created an empty
> .RData file at the root of my project and by double-clicking on this file
> (as you said), the R GUI opens and 'getwd()' returns the path of this
> .RData file. It seems to be a good alternative to .Rproj file to be opened
> with RStudio.
> > ​
> >> However, by far the best approach is to teach your users to fish... if
> you give them an RStudio project directory they can double-click on the
> .Rproj ​file to set the current directory and enter the world of R.​​
> > ​
> > Yes, using an .Rproj file to be opened with RStudio also seems to me to
> be a reasonable solution (the one I chose until now), although it is still
> a workaround and requires RStudio.​
> > Actually in this case, the package 'here'​ I previously mentioned is
> useless to get the current working directory of the project as 'When a
> project is opened within RStudio the following actions are taken: [...] The
> current working directory is set to the project directory.', as stated on
> this page: https://support.rstudio.com/hc/en-us/articles/200526207-
> Using-Projects.
> > So 'getwd()' returns exactly the same as 'here()' does.
> >
> > Best regards,​
> > ​
> > Olivier
> >
> > ________________________________
> > De : Jeff Newmiller <jdnewmil using dcn.davis.ca.us>
> > Envoyé : dimanche 7 octobre 2018 20:48
> > À : Olivier GIVAUDAN
> > Cc : Dénes Tóth; r-help using r-project.org
> > Objet : RE: [R] Genuine relative paths with R
> >
> > On Sun, 7 Oct 2018, Olivier GIVAUDAN wrote:
> >
> >> Hello Denes,
> >>
> >>> Yes, the path to the "root" folder of your project. You seem to have a
> >> really esoteric context if you want to run an R script without knowing
> >> its path in the file system.
> >>
> >> I don't have any esoteric context: I'm just looking for the most
> generic, automatic and reproducible solution.
> >> Of course you always know where an R script is located, nevertheless it
> doesn't imply you want to manually write its path in this
> >> R script. The issue is to have to hardcode an absolute path: I don't
> want that.
> >>
> >>> Because it is extremely rare that someone - who uses R for what it is
> >> worth and in a manner how R is supposed to be used - actually needs such
> >> a function.
> >>
> >
> >> First, the fact that it is rare doesn't mean this need is not legitimate
> >> and relevant: it is needed to make R projects fully movable (i.e.
> >> wherever you want). Second why a vast majority of languages does have
> >> this feature and not R? Why is it useful in these languages and not in
> >> R?
> >
> > The R interpreter does not make assumptions about where the code it is
> > running came from. You might be running it by using the source()
> function,
> > or by using the Rscript program, or by R CMD BATCH, or using eval() on
> > code you pasted together in an R function, or as byte-compiled code
> loaded
> > from an RData file. That is, there is not always a file in a particular
> > directory even involved in the executing code.
> >
> > You also keep referring to "this feature" being in many languages, though
> > you seem to be mistaken about most of them... in fact, they, too, know
> NOT
> > where the script is but where the current directory is ($PWD is the same
> > as getwd()) or where the compilation occurred (__FILE__ in C relates to
> > the source code directory that is usually not where the executable is
> > located and may not even exist on the computer it is running on).
> >
> > I have already pointed out that the solution is to let the OS set the
> > current directory. If you want the user to have access to R independent
> of
> > your code, the easiest way to leave them in Rgui after your code is done
> > is to use save.image() to create a "myApp.RData" file which can be
> > double-clicked [1]. The double-clicking action by default (as defined by
> > the installation of R) causes the operating system to set the current
> > directory to the one containing the file you double-clicked on and then
> > executes the Rgui program.
> >
> > If you don't want the user to interact with your session, you can use the
> > Rscript executable (also mentioned briefly at the bottom of [1]). In both
> > cases, the user has (unknowingly) set the current directory before
> running
> > your code, and there is no need to encode where the script is or was
> > inside the script.
> >
> > You can also create a windows shortcut to invoke Rscript yourself by
> > bootstrapping the RData file and invoking the
> > R.utils::createWindowsShortcut() [2] function.
> >
> > However, by far the best approach is to teach your users to fish... if
> you
> > give them an RStudio project directory they can double-click on the
> .Rproj
> > file to set the current directory and enter the world of R.
> >
> > [1] https://www.r-bloggers.com/look-ma-no-typing-autorunning-
> code-on-r-startup/
> > [2] https://cran.r-project.org/web/packages/R.utils/R.utils.pdf
> >
> > End comment.
> >
> >> Best regards,
> >>
> >> Olivier
> >>
> >> ____________________________________________________________
> _____________________________________________________________________
> >> De : D?nes T?th <toth.denes using kogentum.hu>
> >> Envoy? : samedi 6 octobre 2018 23:36
> >> ? : Olivier GIVAUDAN; Jeff Newmiller; r-help using r-project.org
> >> Objet : Re: [R] Genuine relative paths with R
> >> Hi Olivier,
> >>
> >>
> >> On 10/07/2018 01:13 AM, Olivier GIVAUDAN wrote:
> >>> Hi Denes,
> >>>
> >>> Thank you for the possibility you shared: unfortunately it still uses
> >>> one hardcoded absolute path which I want to avoid.
> >>
> >> Yes, the path to the "root" folder of your project. You seem to have a
> >> really esoteric context if you want to run an R script without knowing
> >> its path in the file system.
> >>
> >>>
> >>> I just think that the solutions suggested are too complicated for my
> >>> simple need.
> >>>
> >>> The root cause being that R doesn't seem to have the Windows batch
> >>> equivalent of cd, or bash equivalent of $PWD, or PHP equivalent of
> __DIR__.
> >>> Hence the workarounds we are discussing.
> >>>
> >>> And finally we go back to my initial question: if such a function
> >>> doesn't exist in R, what are the reasons?
> >>
> >> Because it is extremely rare that someone - who uses R for what it is
> >> worth and in a manner how R is supposed to be used - actually needs such
> >> a function.
> >>
> >> Best,
> >> Denes
> >>
> >>
> >>
> >>>
> >>> Best regards,
> >>>
> >>> Olivier
> >>> ------------------------------------------------------------
> ------------
> >>> *De :* D?nes T?th <toth.denes using kogentum.hu>
> >>> *Envoy? :* samedi 6 octobre 2018 23:05
> >>> *?:* Olivier GIVAUDAN; Jeff Newmiller; r-help using r-project.org
> >>> *Objet :* Re: [R] Genuine relative paths with R
> >>> Hi Olivier,
> >>>
> >>> I really think that Ista and Jeff gave you plenty of useful options how
> >>> you can avoid using absolute paths.
> >>>
> >>> One more possibility: you can use `source()` with the chdir = TRUE
> >>> argument (see ?source). If you have a master script which sources other
> >>> files which are located in a fixed hierarchy relative to the location
> of
> >>> the master script, the only time when you have to use an absolute path
> >>> is when you source your master script, e.g.:
> >>> source("/my/path/to/master.R", chdir = TRUE)
> >>>
> >>> Inside the master script, you can then source the other scripts by
> >>> relative paths, define your 'data' folders relative to the master
> script
> >>> and let the other scripts use those data paths, etc.
> >>>
> >>> Best,
> >>> Denes
> >>>
> >>>
> >>> On 10/06/2018 11:36 PM, Olivier GIVAUDAN wrote:
> >>>> Hi Jeff,
> >>>>
> >>>> Thanks for sharing your workaround.
> >>>>
> >>>> I guess my last answer to Ista answers your question as well.
> >>>>
> >>>> To me this function (an equivalent of 'cd', say) should be
> platform-independent.
> >>>>
> >>>> Best regards,
> >>>>
> >>>> Olivier
> >>>>
> >>>> ________________________________
> >>>> De : Jeff Newmiller <jdnewmil using dcn.davis.ca.us>
> >>>> Envoy??? : samedi 6 octobre 2018 19:31
> >>>> ??? : r-help using r-project.org; Olivier GIVAUDAN; r-help using r-project.org
> >>>> Objet : Re: [R] Genuine relative paths with R
> >>>>
> >>>> I stopped using hardcoded absolute paths inside R scripts years ago,
> and I suspect that is fairly common practice. That is, I
> >> almost never enter a path starting with "/" or "c:/" in an R script.
> >>>>
> >>>> The key concession you have to make is to start your R session in
> your working directory using OS-specific mechanisms, and
> >> then reference your code and data relative to that directory. RStudio
> project files offer one mechanism for doing this; using CD
> >> from  the OS command line is another, and using the file-browser
> >>> double-click mechanism on .RData files is another (though I prefer to
> >>> avoid that these days due to potential global environment
> contamination).
> >>>>
> >>>> Perhaps you can be more specific about what facilities you are
> expecting to find. You should also mention what OS you
> >> typically use and how you normally start R.
> >>>>
> >>>> On October 6, 2018 4:48:44 AM PDT, Olivier GIVAUDAN <
> olivier_givaudan using hotmail.com> wrote:
> >>>>> Dear R users,
> >>>>>
> >>>>> I would like to work with genuine relative paths in R for obvious
> >>>>> reasons: if I move all my scripts related to some project as a whole
> to
> >>>>> another location of my computer or someone else's computer, if want
> my
> >>>>> scripts to continue to run seamlessly.
> >>>>>
> >>>>> What I mean by "genuine" is that it should not be necessary to
> hardcode
> >>>>> one single absolute path (making the code obviously not "portable" -
> to
> >>>>> another place - anymore).
> >>>>>
> >>>>> For the time being, I found the following related posts,
> unfortunately
> >>>>> never conclusive or even somewhat off-topic:
> >>>>> https://stackoverflow.com/questions/1815606/rscript-
> determine-path-of-the-executing-script
> >>>>> https://stackoverflow.com/questions/47044068/get-the-
> path-of-current-script/47045368
> >>>>> http://r.789695.n4.nabble.com/Script-auto-detecting-its-own-
> path-td2719676.html
> >>>>>
> >>>>> So I found 2 workarounds, more or less satisfactory:
> >>>>>
> >>>>>
> >>>>> 1.  Either create a variable "ScriptPath" in the first lines of each
> of
> >>>>> my R scripts and run a batch (or shell, etc.) to replace every single
> >>>>> occurrence of "ScriptPath <-" by "ScriptPath <- [Absolute path of
> the R
> >>>>> script]" in all the R scripts located in the folder (and possibly
> >>>>> subfolders) of the batch file.
> >>>>> 2.  Or create an R project file with RStudio and use the package
> "here"
> >>>>> to get the absolute path of the R project file and put all the R
> >>>>> scripts related to this project in the R project directory, as often
> >>>>> recommended.
> >>>>>
> >>>>> But I am really wondering why R doesn't have (please tell me if I'm
> >>>>> wrong) this basic feature as many other languages have it (batch,
> >>>>> shell, C, LaTeX, SAS with macro-variables, etc.)?
> >>>>> Do you know whether the language will have this kind of function in a
> >>>>> near future? What are the obstacles / what is the reasoning for not
> >>>>> having it already?
> >>>>>
> >>>>> Do you know other workarounds?
> >>>>>
> >>>>> Best regards,
> >>>>>
> >>>>> Olivier
> >>>>>
> >>>>>         [[alternative HTML version deleted]]
> >>>>>
> >>>>> ______________________________________________
> >>>>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> >>>>> 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.
> >>>>
> >>>> --
> >>>> Sent from my phone. Please excuse my brevity.
> >>>>
> >>>>         [[alternative HTML version deleted]]
> >>>>
> >>>>
> >>>>
> >>>> ______________________________________________
> >>>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> >>>> 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.
> >>>>
> >>
> >>
> >
> > ------------------------------------------------------------
> ---------------
> > Jeff Newmiller                        The     .....       .....  Go
> Live...
> > DCN:<jdnewmil using dcn.davis.ca.us>        Basics: ##.#.       ##.#.  Live
> Go...
> >                                         Live:   OO#.. Dead: OO#..
> Playing
> > Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
> > /Software/Embedded Controllers)               .OO#.       .OO#.
> rocks...1k
> > ------------------------------------------------------------
> ---------------
> >
> >        [[alternative HTML version deleted]]
> >
> > ______________________________________________
> > R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> > 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.
> >
>
>
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.
>

	[[alternative HTML version deleted]]




More information about the R-help mailing list