[R] detecting the sourcing of site profile on Startup versus post-Startup

Benjamin Tyner btyner at gmail.com
Fri Apr 25 03:17:37 CEST 2014


I absolutely agree it is a bad idea to rely on side effects.

I did figure out one way to skin this cat. It relies on an the following
from line 909 of src/main/main.c,

    R_LoadProfile(R_OpenSiteFile(), baseEnv);
    R_LockBinding(install(".Library.site"), R_BaseEnv);
    R_LoadProfile(R_OpenInitFile(), R_GlobalEnv);

to illustrate, if one puts at the top of the site profile:

   if (bindingIsLocked(".Library.site", .BaseNamespaceEnv)) {
      # site profile has already finished loading;
      # put code here for that case. for example,
      if (identical(.BaseNamespaceEnv$.GoodJob, Sys.getpid())) {
          warning("you appear to be using the same file for both site
and user profiles, or to have sourced this file post-startup.")
      warning("this file is not intended to be used in this fashion.")
   } else {
      # site profile is in process of loading;
      # put code here for that case. for example,
      message("good job! startup loaded the correct site profile.")
      .GoodJob <- Sys.getpid()

Not exactly best practice to rely on an implementation detail, but I
found it interesting nevertheless.


On 04/23/2014 09:31 PM, Jeff Newmiller wrote:
> Regardless of whether this is possible, it seems like a bad idea (side effects in a functional programming environment). If you want to do something special in startup then write a different function that does that stuff and then call the desired functions explicitly when you want them to be called.
> ---------------------------------------------------------------------------
> 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
> --------------------------------------------------------------------------- 
> Sent from my phone. Please excuse my brevity.
> On April 23, 2014 6:11:09 PM PDT, Benjamin Tyner <btyner at gmail.com> wrote:
>> Thanks  Duncan!  Yes, I considered taking advantage of .First, but was
>> concerned that the .First defined by the site profile could be masked
>> by a
>> possible .First defined by the user profile (I neglected to mention
>> that
>> "--no-init-profile"  [sic]  in  the  example  I gave was a simplifying
>>   assumption, sorry about that).
>>   On 04/23/2014 06:55 AM, Duncan Murdoch wrote:
>>     On 22/04/2014, 8:59 PM, Benjamin Tyner wrote:
>>     Greetings,
>> Is there any way to programmatically detect whether a piece of code is
>>   being run within the initial (Startup) sourcing of the site profile?
>>   For example, say I have a site profile, "/path/to/Rprofile.site". Is
>>   there any function "my_func" which would return different values for
>>     these two instances:
>>         Rscript --no-site-profile --no-init-profile -e
>>    "sys.source('/path/to/Rprofile.site',  envir  = .BaseNamespaceEnv);
>>     my_func()"
>>     versus:
>>         export R_PROFILE=/path/to/Rprofile.site
>>         Rscript --no-init-profile -e "my_func()"
>> The commandArgs() function could see the different command lines and
>> your
>>     function could deduce the difference from that.
>> As far as I know, R keeps no other records of the startup process, but
>> if
>> you can modify other files, you could leave a record when .First was
>> run,
>>    and see that it was run before Rprofile.site in the first case. See
>>     ?Startup.
>>     Duncan Murdoch
>>   --
>> ------------------------------------------------------------------------
>> ______________________________________________
>> R-help at r-project.org mailing list
>> 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