user1830307
user1830307

Reputation:

No visible binding for '<<-' Assignment

I have solved variants of the "no visible binding" notes that one gets when checking their package. However, I am unable to solve the situation when applied to the '<<-' assignment.

Specifically, I had defined and used a local variable in several functions, such as:

fName = function(df){
  eval({vName<<-0}, envir=environment(fName))
}

However when I run check() from devtools, I get the error:

fName: no visible binding for '<<-' assignment to 'vName'

So, I tried using a different syntax, as follows:

fName = function(df){
  assign("vName",0, envir=environment(fName))
}

But got the check() error:

cannot add bindings to a locked environment

When I tried:

fName = function(df){
  assign("vName",0, envir=environment(-1))
}

I got the error:

use of NULL environment is defunct

So, my question is how I can accomplish the assignment operator <<- without getting a note in the check() from devtools.

Thank you.

Upvotes: 3

Views: 2459

Answers (2)

i dont know if it helps after that many years.I had the same problem,and what i did to solve it is : utils::globalVariables(c("global_var"))

Write this r code somewhere inside the R directory(save it as R file).Whenever you assign a global var assign it also locally like so:

global_var<<-1
global_var<-1 

That worked for me.

Upvotes: 2

Rich Scriven
Rich Scriven

Reputation: 99361

The easy answer is - Don't use <<- in your package. One Alterna way you can make assignments to an environment (but not a meaningful one) is to create a locked binding.

e <- new.env()
e$vName <- 0L
lockBinding("vName", e)
vName
# Error: object 'vName' not found
with(e, vName)
# [1] 0
e$vName <- 5
# Error in e$vName <- 5 : cannot change value of locked binding for 'vName'

You can also lock an environment, but not a meaningful one.

lockEnvironment(e)
rm(vName, envir = e)
# Error in rm(vName, envir = e) : 
#   cannot remove bindings from a locked environment

Have a look at help(bindenv), it's a good read.

Updated Since you mentioned you might be waiting to make assignment rather than at load times, have a read of help(globalVariables) It's another best-seller at ?

For globalVariables, the names supplied are of functions or other objects that should be regarded as defined globally when the check tool is applied to this package. The call to globalVariables will be included in the package's source. Repeated calls in the same package accumulate the names of the global variables.

Upvotes: 4

Related Questions