[Rd] Puzzled about a new method for "[".

Rolf Turner r@turner @end|ng |rom @uck|@nd@@c@nz
Sun Nov 3 22:11:34 CET 2019

I recently tried to write a new method for "[", to be applied to data 
frames, so that the object returned would retain (all) attributes of the 
columns, including attributes that my code had created.

I thrashed around for quite a while, and then got some help from Rui 
Barradas who showed me how to do it, in the following manner:

`[.myclass` <- function(x, i, j, drop = if (missing(i)) TRUE else 
length(cols) == 1)[{
    SaveAt <- lapply(x, attributes)
    x <- NextMethod()
    lX <- lapply(names(x),function(nm, x, Sat){
      attributes(x[[nm]]) <- Sat[[nm]]
      x[[nm]]}, x = x, Sat = SaveAt)
    names(lX) <- names(x)
    x <- as.data.frame(lX)

If I set class(X) <- c("myclass",class(X)) and apply "[" to X (e.g. 
something like X[1:42,]) the attributes are retained as desired.

OK.  All good.  Now we finally come to my question!  I want to put this 
new method into a package that I am building.  When I build the package 
and run R CMD check I get a complaint:

... no visible binding for global variable ‘cols’

And indeed, there is no such variable.  At first I thought that maybe 
the code should be

`[.myclass` <- function(x, i, j, drop = if (missing(i)) TRUE else
                                       length(j) == 1)[{

But I looked at "[.data.frame" and it has "cols" too; not "j".

So why doesn't "[.data.frame" throw a warning when R gets built?

Can someone please explain to me what's going on here?



P. S. I amended the code for my method, replacing "cols" by "j", and it 
*seems* to run, and deliver the desired results.  (And the package 
checks, without complaint.) I am nervous, however, that there may be 
some Trap for Young Players that I don't perceive, lurking about and 
waiting to cause problems for me.


Honorary Research Fellow
Department of Statistics
University of Auckland
Phone: +64-9-373-7599 ext. 88276

More information about the R-devel mailing list