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@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@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel