[R] Genuine relative paths with R
Duncan Murdoch
murdoch@dunc@n @end|ng |rom gm@||@com
Wed Oct 10 16:51:32 CEST 2018
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