[Rd] Fwd: Using existing envars in Renviron on friendly Windows

Tomas Kalibera tom@@@k@||ber@ @end|ng |rom gm@||@com
Sun Oct 31 10:59:21 CET 2021


On 10/31/21 2:55 AM, Henrik Bengtsson wrote:
>> ... If one still needed backslashes,
>> they could then be entered in single quotes, e.g. VAR='c:\users'.
> I don't think it matters whether you use single or double quotes -
> both will work.  Here's a proof of concept on Linux with R 4.1.1:
>
> $ cat ./.Renviron
> A=C:\users
> B='C:\users'
> C="C:\users"
>
> $ Rscript -e "Sys.getenv(c('A', 'B', 'C'))"
>            A           B           C
>    "C:users" "C:\\users" "C:\\users"

Yes, but as I wrote "I think the Renviron files should be written in a 
way so that they would work the same in a POSIX shell". This is why 
single quotes. With double quotes, backslashes are interpreted 
differently from a POSIX shell.

Tomas


>
> /Henrik
>
> On Wed, Oct 27, 2021 at 11:45 AM Tomas Kalibera
> <tomas.kalibera using gmail.com> wrote:
>>
>> On 10/21/21 5:18 PM, Martin Maechler wrote:
>>>>>>>> Michał Bojanowski
>>>>>>>>       on Wed, 20 Oct 2021 16:31:08 +0200 writes:
>>>       > Hello Tomas,
>>>       > Yes, that's accurate although rather terse, which is perhaps the
>>>       > reason why I did not realize it applies to my case.
>>>
>>>       > How about adding something in the direction of:
>>>
>>>       > 1. Continuing the cited paragraph with:
>>>       > In particular, on Windows it may be necessary to quote references to
>>>       > existing environment variables, especially those containing file paths
>>>       > (which include backslashes). For example: `"${WINVAR}"`.
>>>
>>>       > 2. Add an example (not run):
>>>
>>>       > # On Windows do quote references to variables containing paths, e.g.:
>>>       > # If APPDATA=C:\Users\foobar\AppData\Roaming
>>>       > # to point to a library tree inside APPDATA in .Renviron use
>>>       > R_LIBS_USER="${APPDATA}"/R-library
>>>
>>>       > Incidentally the last example is on backslashes too.
>>>
>>>
>>>       > What do you think?
>>>
>>> I agree that adding an example really helps a lot in such cases,
>>> in my experience, notably if it's precise enough to be used +/- directly.
>> Yes, I agree as well. I think the Renviron files should be written in a
>> way so that they would work the same in a POSIX shell, so e.g.
>> VAR="${VAR0}" or VAR="${VAR0}/subdir" are the recommended ways to
>> preserve backslashes in VAR0. It is better to use forward slashes in
>> string literals, e.g. VAR="c:/users". If one still needed backslashes,
>> they could then be entered in single quotes, e.g. VAR='c:\users'.
>>
>> The currently implemented parsing of Renviron files differs in a number
>> of details from POSIX shells, some are documented and some are not.
>> Relying only on the documented behavior that is the same as in POSIX
>> shells is the best choice for future compatibility.
>>
>> Tomas
>>
>>>
>>>       > On Mon, Oct 18, 2021 at 5:02 PM Tomas Kalibera <tomas.kalibera using gmail.com> wrote:
>>>       >>
>>>       >>
>>>       >> On 10/15/21 6:44 PM, Michał Bojanowski wrote:
>>>       >> > Perhaps a small update to ?.Renviron would be in order to mention that...
>>>       >>
>>>       >> Would you have a more specific suggestion how to update the
>>>       >> documentation? Please note that it already says
>>>       >>
>>>       >> "‘value’ is then processed in a similar way to a Unix shell: in
>>>       >> particular the outermost level of (single or double) quotes is stripped,
>>>       >> and backslashes are removed except inside quotes."
>>>       >>
>>>       >> Thanks,
>>>       >> Tomas
>>>       >>
>>>       >> > On Fri, Oct 15, 2021 at 6:43 PM Michał Bojanowski <michal2992 using gmail.com> wrote:
>>>       >> >> Indeed quoting works! Kevin suggested the same, but he didnt reply to the list.
>>>       >> >> Thank you all!
>>>       >> >> Michal
>>>       >> >>
>>>       >> >> On Fri, Oct 15, 2021 at 6:40 PM Ivan Krylov <krylov.r00t using gmail.com> wrote:
>>>       >> >>> Sorry for the noise! I wasn't supposed to send my previous message.
>>>       >> >>>
>>>       >> >>> On Fri, 15 Oct 2021 16:44:28 +0200
>>>       >> >>> Michał Bojanowski <michal2992 using gmail.com> wrote:
>>>       >> >>>
>>>       >> >>>> AVAR=${APPDATA}/foo/bar
>>>       >> >>>>
>>>       >> >>>> Which is a documented way of referring to existing environment
>>>       >> >>>> variables. Now, with that in R I'm getting:
>>>       >> >>>>
>>>       >> >>>> Sys.getenv("APPDATA")    # That works OK
>>>       >> >>>> [1] "C:\\Users\\mbojanowski\\AppData\\Roaming"
>>>       >> >>>>
>>>       >> >>>> so OK, but:
>>>       >> >>>>
>>>       >> >>>> Sys.getenv("AVAR")
>>>       >> >>>> [1] "C:UsersmbojanowskiAppDataRoaming/foo/bar"
>>>       >> >>> Hmm, a function called by readRenviron does seem to remove backslashes,
>>>       >> >>> but not if they are encountered inside quotes:
>>>       >> >>>
>>>       >> >>> https://github.com/r-devel/r-svn/blob/3f8b75857fb1397f9f3ceab6c75554e1a5386adc/src/main/Renviron.c#L149
>>>       >> >>>
>>>       >> >>> Would AVAR="${APPDATA}"/foo/bar work?
>>>       >> >>>
>>>       >> >>> --
>>>       >> >>> Best regards,
>>>       >> >>> Ivan
>>>       >> > ______________________________________________
>>>       >> > R-devel using r-project.org mailing list
>>>       >> > https://stat.ethz.ch/mailman/listinfo/r-devel
>>>
>>>       > ______________________________________________
>>>       > R-devel using r-project.org mailing list
>>>       > https://stat.ethz.ch/mailman/listinfo/r-devel
>> ______________________________________________
>> R-devel using r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list