[R] avoid <<- in specific case
Sarah Goslee
sarah.goslee at gmail.com
Fri Oct 5 15:23:25 CEST 2012
Hi Berry,
You might look at scatterplot3d in the scatterplot3d package for an
example of how a similar problem was handled, precisely as Duncan
suggests.
Sarah
On Fri, Oct 5, 2012 at 8:25 AM, Duncan Murdoch <murdoch.duncan at gmail.com> wrote:
> On 05/10/2012 8:19 AM, Berry Boessenkool wrote:
>>
>>
>> Hi all,
>>
>> I improved a function drawing horizontal histograms (code below) which
>> uses barplot and works fine.
>> It does,however, need to assign a function to the global environment to
>> later find the actual location on the vertical axis, and not the number of
>> bars used by barplot.
>> Hopefully, running the examples below will illustrate that.
>>
>> As said, it works perfectly fine and does exactly what I want.
>> The problem arises now that I'm building a package (just for myself, for
>> now) and run into R CMD
>> check telling me 'no visible binding for '<<-' assignment'.
>> (wording below)
>> Similar problem as in
>> http://r.789695.n4.nabble.com/R-CMD-check-tells-me-no-visible-binding-for-global-variable-what-does-it-mean-td1837236.html
>>
>> My question is:
>> Is there a way to avoid assigning the function to the global environment
>> with <<- but still have it available? I know it is generally not good
>> practice.
>
>
> You can return the function as the value of your function. A bonus: if it
> is created within the body of your function, it will have access to all the
> local variables there.
>
> You shouldn't write to the global environment, because globalenv belongs to
> the user, not to you. If the user wants your function in the global
> environment s/he can just assign the value of your function to a variable
> there.
>
> Duncan Murdoch
>
>
>
>> Or ist it OK in a case like this, and is there a way to avoid the notes
>> from the rcmd check (make the function package-compatible)?
>> Or should I just ignore these notes? (I'm completely new to building
>> packages and cannot judge the importance yet.)
>>
>> I'd be very thankful for any hints!
>>
>> Berry
>>
>> PS: I recently read about barcharts in lattice, but by now I'm already
>> used to my function. (And I learned a lot writing it a couple of years ago).
>>
>> # Function
>> horiz.hist <- function(Data, breaks="Sturges", col="transparent", las=1,
>> ylim=range(HBreaks), labelat=pretty(ylim), labels=labelat,
>> border=par("fg"), ... )
>> {a <- hist(Data, plot=FALSE, breaks=breaks)
>> HBreaks <- a$breaks
>> HBreak1 <- a$breaks[1]
>> hpos <<- function(Pos) (Pos-HBreak1)*(length(HBreaks)-1)/
>> diff(range(HBreaks)) # Assign a function to the global environment with
>> values calculated inside the main function.
>> barplot(a$counts, space=0, horiz=T, ylim=hpos(ylim), col=col,
>> border=border,...)
>> axis(2, at=hpos(labelat), labels=labels, las=las, ...)
>> print("use hpos() to address y-coordinates") }
>>
>> # Data and basic concept
>> set.seed(8); ExampleData <- rnorm(50,8,5)+5
>> hist(ExampleData)
>> horiz.hist(ExampleData, xlab="absolute frequency")
>> # Caution: the labels at the y-axis are not the real coordinates!
>> # abline(h=2) will draw above the second bar, not at the label value 2.
>> Use hpos:
>> abline(h=hpos(11), col=2)
>>
>> # Further arguments
>> horiz.hist(ExampleData, xlim=c(-8,20))
>> horiz.hist(ExampleData, main="the ... argument worked!", col.axis=3)
>> hist(ExampleData, xlim=c(-10,40)) # with xlim
>> horiz.hist(ExampleData, ylim=c(-10,40), border="red") # with ylim
>> horiz.hist(ExampleData, breaks=20, col="orange")
>> axis(2, hpos(0:10), labels=F, col=2) # another use of hpos()
>>
>> # One shortcoming: doesn't work with breakpoints provided as a vector with
>> different widths of the bars
>>
>>
>> Wording from the rcmd check when building a package:
>> * checking R code for possible problems ... NOTE
>> horiz.hist: no visible binding for '<<-' assignment to 'hpos'
>> horiz.hist: no visible global function definition for 'hpos'
>>
>>
>>
--
Sarah Goslee
http://www.functionaldiversity.org
More information about the R-help
mailing list