Well, no idea... I just created a file 'TestPWD', made it executable, inserted in it these lines and moved the file in various places: #!/bin/bash echo $PWD read -p "" ________________________________ De : Duncan Murdoch <murdoch.duncan at gmail.com> Envoy? : mercredi 10 octobre 2018 15:20 ? : Olivier GIVAUDAN; Jeff Newmiller Cc : r-help at r-project.org Objet : Re: [R] Genuine relative paths with R 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. Duncan Murdoch> > Best regards, > > Olivier > ------------------------------------------------------------------------ > *De :* Duncan Murdoch <murdoch.duncan at gmail.com> > *Envoy? :* mercredi 10 octobre 2018 14:51 > *? :* Olivier GIVAUDAN; Jeff Newmiller > *Cc :* r-help at 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 at dcn.davis.ca.us> >> Envoy? : dimanche 7 octobre 2018 20:48 >> ? : Olivier GIVAUDAN >> Cc : D?nes T?th; r-help at 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 at kogentum.hu> >>> Envoy? : samedi 6 octobre 2018 23:36 >>> ? : Olivier GIVAUDAN; Jeff Newmiller; r-help at 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 at kogentum.hu> >>>> *Envoy? :* samedi 6 octobre 2018 23:05 >>>> *?:* Olivier GIVAUDAN; Jeff Newmiller; r-help at 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 at dcn.davis.ca.us> >>>>> Envoy??? : samedi 6 octobre 2018 19:31 >>>>> ??? : r-help at r-project.org; Olivier GIVAUDAN; r-help at 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 at 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 at 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 at 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 at 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 at 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]]
On 10/10/2018 3:51 PM, Olivier GIVAUDAN wrote:> Well, no idea... > > I just created a file 'TestPWD', made it executable, inserted in it > these lines and moved the file in various places: > > #!/bin/bash > > echo $PWD > read -p ""When I execute that, it prints my working directory. Doesn't matter where the TestPWD file is. If I put it in directory "foo", and change to foo's parent, then foo/TestPWD prints the name of the parent directory, not the foo directory. If I then add foo to the PATH, and run TestPWD I get the same thing. I find it unbelievable that you are seeing anything different from that on a Unix-alike. Duncan Muroch> ------------------------------------------------------------------------ > *De :* Duncan Murdoch <murdoch.duncan at gmail.com> > *Envoy? :* mercredi 10 octobre 2018 15:20 > *? :* Olivier GIVAUDAN; Jeff Newmiller > *Cc?:* r-help at r-project.org > *Objet :* Re: [R] Genuine relative paths with R > 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. > > Duncan Murdoch > > >> >> Best regards, >> >> Olivier >> ------------------------------------------------------------------------ >> *De :* Duncan Murdoch <murdoch.duncan at gmail.com> >> *Envoy? :* mercredi 10 octobre 2018 14:51 >> *? :* Olivier GIVAUDAN; Jeff Newmiller >> *Cc?:* r-help at 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 at dcn.davis.ca.us> >>> Envoy? : dimanche 7 octobre 2018 20:48 >>> ? : Olivier GIVAUDAN >>> Cc : D?nes T?th; r-help at 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 at kogentum.hu> >>>> Envoy? : samedi 6 octobre 2018 23:36 >>>> ? : Olivier GIVAUDAN; Jeff Newmiller; r-help at 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 at kogentum.hu> >>>>> *Envoy? :* samedi 6 octobre 2018 23:05 >>>>> *?:* Olivier GIVAUDAN; Jeff Newmiller; r-help at 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 at dcn.davis.ca.us> >>>>>> Envoy??? : samedi 6 octobre 2018 19:31 >>>>>> ??? : r-help at r-project.org; Olivier GIVAUDAN; r-help at 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 at 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 at 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 at 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 at 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 at 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. >>> >> >
Why are you not simply double-clicking on 'TestPWD' and choosing to execute the file (don't add anything)? Are you executing the file from a terminal? ________________________________ De : Duncan Murdoch <murdoch.duncan at gmail.com> Envoy? : mercredi 10 octobre 2018 20:17 ? : Olivier GIVAUDAN; Jeff Newmiller Cc : r-help at r-project.org Objet : Re: [R] Genuine relative paths with R On 10/10/2018 3:51 PM, Olivier GIVAUDAN wrote:> Well, no idea... > > I just created a file 'TestPWD', made it executable, inserted in it > these lines and moved the file in various places: > > #!/bin/bash > > echo $PWD > read -p ""When I execute that, it prints my working directory. Doesn't matter where the TestPWD file is. If I put it in directory "foo", and change to foo's parent, then foo/TestPWD prints the name of the parent directory, not the foo directory. If I then add foo to the PATH, and run TestPWD I get the same thing. I find it unbelievable that you are seeing anything different from that on a Unix-alike. Duncan Muroch> ------------------------------------------------------------------------ > *De :* Duncan Murdoch <murdoch.duncan at gmail.com> > *Envoy? :* mercredi 10 octobre 2018 15:20 > *? :* Olivier GIVAUDAN; Jeff Newmiller > *Cc :* r-help at r-project.org > *Objet :* Re: [R] Genuine relative paths with R > 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. > > Duncan Murdoch > > >> >> Best regards, >> >> Olivier >> ------------------------------------------------------------------------ >> *De :* Duncan Murdoch <murdoch.duncan at gmail.com> >> *Envoy? :* mercredi 10 octobre 2018 14:51 >> *? :* Olivier GIVAUDAN; Jeff Newmiller >> *Cc :* r-help at 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 at dcn.davis.ca.us> >>> Envoy? : dimanche 7 octobre 2018 20:48 >>> ? : Olivier GIVAUDAN >>> Cc : D?nes T?th; r-help at 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 at kogentum.hu> >>>> Envoy? : samedi 6 octobre 2018 23:36 >>>> ? : Olivier GIVAUDAN; Jeff Newmiller; r-help at 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 at kogentum.hu> >>>>> *Envoy? :* samedi 6 octobre 2018 23:05 >>>>> *?:* Olivier GIVAUDAN; Jeff Newmiller; r-help at 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 at dcn.davis.ca.us> >>>>>> Envoy??? : samedi 6 octobre 2018 19:31 >>>>>> ??? : r-help at r-project.org; Olivier GIVAUDAN; r-help at 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 at 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 at 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 at 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 at 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 at 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]]