[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)
x
}
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?
cheers,
Rolf
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.
R.
--
Honorary Research Fellow
Department of Statistics
University of Auckland
Phone: +64-9-373-7599 ext. 88276
More information about the R-devel
mailing list