How can I handle R CMD check no visible binding for global variable notes when my ggplot2 syntax is sensible?
Have you tried with aes_string
instead of aes
? This should work, although I haven't tried it:
aes_string(x = 'x.values', y = 'y.values')
No visible binding for global variable Note in R CMD check
To get it past R CMD check
you can either :
- Use
get("b")
(but that is onerous) - Place
a=b=NULL
somewhere higher up in your function (that's what I do)
There was a thread on r-devel a while ago where somebody from r-core basically said (from memory) "NOTES are ok, you know. The assumption is that the author checked it and is ok with the NOTE.". But, I agree with you. I do prefer to have CRAN checks return a clean "OK" on all platforms. That way the user is left in no doubt that it passes checks ok.
EDIT :
Here is the r-devel thread I was remembering (from April 2010). So that appears to suggest that there are some situations where there is no known way to avoid the NOTE, but that's ok.
R CMD check NOTE: `No visible binding for global variable`, when defining a variable in an S3 generic and using it in a method
Answering myself, I think this practice can lead to confusing behaviour since UseMethod()
generates a call of the appropriate method with its same arguments; implying that modifications to a variable which is an argument of the generic (not like greeting
in my example above) are not propagated to the method.
Right now I'm defining extra functions to be called at the beginning of each method to perform the complex computation I was originally doing in the generic. This can also lead to cumbersome code if these functions require many arguments, but is the best solution I have found so far.
I will leave this open for some time to see if someone has other approaches to propose.
No visible global function definition/no visible binding for global variable in a project?
You could disable the object usage linter in your project. Example: https://github.com/ropensci/targets/blob/8c42336a228874889c9ee99dd154c567b4eee91a/.lintr#L4. More on linters: https://github.com/r-lib/lintr#available-linters
R CMD check: no visible binding for global variable (when using a data/ dataset in the package)
Usually, to get rid of that Note you just have to add a reference like this:
ggplot2::diamonds
R no visible binding for global variable note when creating variables in sub-routines and returning to environment
SOLUTION USING ENVIRONMENTS
So I figured out how to do this. Yes, you can use the list approach, but it is somewhat artificial. Here is the proper way: define a named empty environment inside the wrapper function outside_function, to which all objects that you want to store (and return at the end) are written. This environment is then passed as a single argument (like a list) to the inside functions. Within inside_function, you can edit stored environment objects in real time, without having to explicitly return the objects in a list back to a list object. It is cleaner.
outside_function <- function() {
myenv <- new.env(parent = emptyenv())
#object k exists in local environment, but not myenv
k <- LETTERS[17:23]
#assign list of objects to
print(ls()) #two objects, k and myenv
print(ls(myenv))
print("first run")
inside_function(env=myenv)
print("LS")
print(as.list(myenv))
print("second run")
inside_function(env=myenv)
print("LS")
print(as.list(myenv))
#inside here, have to refer to objects as list elements
#the command print(m) searches through environments to find an object
#if nothing exists locally, m will find myenv$m, but is misleading
#try(print(m))
#now create a local object m that is different
m <- "blah"
print(m) #gives 'blah'
print(myenv$m)
#return at end as a list
invisible(as.list(myenv))
}
inside_function <- function(env) {
#create/overwrite objects in env
env$m <- matrix(stats::runif(4), ncol=2)
#these are created in real time within inside_function without having
#to return env (notice NULL is a returned value)
print(env$m)
#overwite
env$m <- matrix(stats::runif(4), ncol=2)
print(env$m)
env$d <- 5
print(env$d)
env$d <- env$d + runif(1)
env$z <- letters[sample(1:20, size=6)]
invisible(NULL)
}
tmp <- outside_function()
print(tmp) #contains all the objects as a list
Related Topics
Combine Two Data Frames with All Posible Combinations
Combine Several Data Frames in the Global Environment by Row (Rbind)
Spreading a Two Column Data Frame with Tidyr
Lapply-Ing with the "$" Function
Extract Text After "/" in a Data Frame Column
R Ifelse Avoiding Change in Date Format
Split Data Frame into Rows of Fixed Size
Fixing Cluttered Titles on Graphs
How to Specify a Dynamic Position for the Start of Substring
Tidyr How to Spread into Count of Occurrence
How to Assign a Value Using If-Else Conditions in R
Merging Rows with the Same Id Variable
Randomly Insert Nas into Dataframe Proportionaly
How to Stack Error Bars in a Stacked Bar Plot Using Geom_Errorbar
How to Get a Barplot with Several Variables Side by Side Grouped by a Factor
Using R Statistics Add a Group Sum to Each Row
Ggplot2: How to Use Same Colors in Different Plots for Same Factor