[Rd] bug [methods]: double execution of `insertSource` within the same session does not work

Michael Lawrence lawrence.michael at gene.com
Mon Jan 29 20:02:08 CET 2018


Thanks, I will fix this.

On Mon, Jan 29, 2018 at 8:06 AM, Demetrio Rodriguez T. <
demetrio.rodriguez.t at gmail.com> wrote:

> Hello everyone,
>
>
> I hope this reaches someone at all. It's my first bug report to the R-core,
> and, apparently, bugzilla is locked from new reports for now.
>
> I was using `methods::insertSource` to debug and successfully fix another
> package, until it suddenly stopped working. I figured out, that it is
> because I am using it on the same function multiple times within one
> session. It also produces warnings even during the first call, but somehow
> still works. Below I provide a reproducible example:
>
> SETUP:
> ```bash
> demetrio at laptop:[folder_structure]/Bugreports/methods_insertSource$ ls -a
> .  ..  gmapsdistance_fix.R  methods_insertSource.R
> ```
>
> file `gmapsdistance_fix.R`
> ```R
> gmapsdistance = function(param) {
>     print('I am a bug report, my params are:')
>     print(param)
> }
> ```
>
>
> file `methods_insertSource.R`
> ```R
> library(gmapsdistance)  # works with any package
>
> methods::insertSource('gmapsdistance_fix.R',
>     package = 'gmapsdistance',
>     functions = 'gmapsdistance',
>     force = T
> )
> buggy = gmapsdistance('Works?')
> ```
>
>
> TO REPRODUCE:
> in that directory `R --vanilla` then
> ```R
> > source('methods_insertSource.R')
> Modified functions inserted through trace(): gmapsdistance
> [1] "I am a bug report, my params are:"
> [1] "Works?"
> Warning message:
> In methods::insertSource("gmapsdistance_fix.R", package = "gmapsdistance",
> :
>   cannot insert these (not found in source): "gmapsdistance"
> # Works, but gives the warning that it does not
>
> # repeat:
> > source('methods_insertSource.R')
> Error in assign(this, thisObj, envir = envwhere) :
>   cannot change value of locked binding for 'gmapsdistance'
> In addition: Warning message:
> In methods::insertSource("gmapsdistance_fix.R", package = "gmapsdistance",
> :
>   cannot insert these (not found in source): "gmapsdistance"
>
> # does not work, and gets even more confusing: so is it that the object is
> not find, or is it about a locked object?
> ```
>
> I think it's a bug.
>
> --------------------- BUG REPORT END ------------------------
>
>
> I looked into it a bit myself, in case you are interested:
>
> ```R
> # lines 20-22
>     if (is(source, "environment"))
>         env <- source
>     else env <- evalSource(source, package, FALSE)
>     # We're in the second case I guess
>
> # Browse[2]> env
> # Object of class "sourceEnvironment"
> # Source environment created  2017-12-01 05:19:51
> # For package "gmapsdistance"
> # From source file "gmapsdistancefix.R"
>
>
> # later, before line 52:
> x = env
> Browse[2]> package
> [1] "gmapsdistance"
>
> # evaluate 52
> packageSlot(env) <- package
>
> # objects x and env are still identical
> # Browse[2]> class(env)
> # [1] "sourceEnvironment"
> # attr(,"package")
> # [1] "methods"
> # Browse[2]> class(x)
> # [1] "sourceEnvironment"
> # attr(,"package")
> # [1] "methods"
>
> # Browse[2]> env
> # Object of class "sourceEnvironment"
> # Source environment created  2017-12-01 05:19:51
> # For package "gmapsdistance"
> # From source file "gmapsdistancefix.R"
> # Browse[2]> x
> # Object of class "sourceEnvironment"
> # Source environment created  2017-12-01 05:19:51
> # For package "gmapsdistance"
> # From source file "gmapsdistancefix.R"
>
> # so:
> Browse[2]>  names(env)
> NULL
>
> # which is why 53-60 do not work:
> allObjects <- names(env)
> if (!missing(functions)) {
>     notThere <- is.na(match(functions, allObjects))
>     if (any(notThere)) {
>         warning(gettextf("cannot insert these (not found in source): %s",
>             paste("\"", functions[notThere], "\"", sep = "",
>                 collapse = ", ")), domain = NA)
>     }
> }
> ```
>
> Looking forward to your feedback!
>
> Cheers,
> Demetrio
>
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>

	[[alternative HTML version deleted]]



More information about the R-devel mailing list