[R] Genuine relative paths with R
Duncan Murdoch
murdoch@dunc@n @end|ng |rom gm@||@com
Wed Oct 10 17:21:44 CEST 2018
On 10/10/2018 11:20 AM, Duncan Murdoch wrote:
> On 10/10/2018 11:18 AM, Olivier GIVAUDAN 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)...
>
> Not for me. Always prints the user's working directory.
... unless some earlier lines in the script changed it, of course.
Duncan Murdoch
>
> Duncan Murdoch
>
>
>>
>> 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.
>>>
>>
>
More information about the R-help
mailing list