[Rd] [External] Re: Possible bug in `class<-` when a class-specific '[[.' method is defined

Tierney, Luke |uke-t|erney @end|ng |rom u|ow@@edu
Mon Jul 15 15:24:10 CEST 2019


Pasting the entire example into RStudio and hitting return to evaluate
does not show this. Evaluating the finall line to print counttt
separately does.

Looks like RStudio is calling `[[` on your object when examining the
environment for the Environment panel. If this concerns you then you
should contact RStudio.

Best,

luke

On Mon, 15 Jul 2019, Rui Barradas wrote:

> Hello,
>
> Clean R 3.6.1 session on Ubuntu 19.04, RStudio 1.1.453. sessionInfo() at the 
> end.
>
> I can reproduce this.
>
> counttt <- 0
>
> `[[.MYCLASS` = function(x, ...) {
>  counttt <<- counttt + 1
>  # browser()
>  x = NextMethod()
>  return(x)
> }
>
> df <- as.data.frame(matrix(1:20, nrow=5))
> class(df) <- c("MYCLASS","data.frame")
> counttt
> #[1] 9
>
>
> But there's more. I tried to print the values of x in the method and got 
> really strange results
>
> counttt <- 0
>
> `[[.MYCLASS` = function(x, ...) {
>  counttt <<- counttt + 1
>  print(x)
>  # browser()
>  x = NextMethod()
>  return(x)
> }
>
> df <- as.data.frame(matrix(1:20, nrow=5))
> class(df) <- c("MYCLASS","data.frame")
> counttt
> #[1] 151
>
>
> If I change print to print.data.frame it goes up to
>
> counttt
> #[1] 176
>
> With print.default back to 9. What is the print method called in the second 
> example?
>
>
> sessionInfo()
> R version 3.6.1 (2019-07-05)
> Platform: x86_64-pc-linux-gnu (64-bit)
> Running under: Ubuntu 19.04
>
> Matrix products: default
> BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.8.0
> LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.8.0
>
> locale:
> [1] LC_CTYPE=pt_PT.UTF-8       LC_NUMERIC=C
> [3] LC_TIME=pt_PT.UTF-8        LC_COLLATE=pt_PT.UTF-8
> [5] LC_MONETARY=pt_PT.UTF-8    LC_MESSAGES=pt_PT.UTF-8
> [7] LC_PAPER=pt_PT.UTF-8       LC_NAME=C
> [9] LC_ADDRESS=C               LC_TELEPHONE=C
> [11] LC_MEASUREMENT=pt_PT.UTF-8 LC_IDENTIFICATION=C
>
> attached base packages:
> [1] stats     graphics  grDevices utils     datasets  methods
> [7] base
>
> loaded via a namespace (and not attached):
>  [1] sos_2.0-0           nlme_3.1-140        matrixStats_0.54.0
>  [4] fs_1.2.7            xts_0.11-2          usethis_1.5.0
>  [7] lubridate_1.7.4     devtools_2.0.2      RColorBrewer_1.1-2
> [10] rprojroot_1.3-2     rbenchmark_1.0.0    tools_3.6.1
> [13] backports_1.1.4     R6_2.4.0            rpart_4.1-15
> [16] Hmisc_4.2-0         lazyeval_0.2.2      colorspace_1.4-1
> [19] nnet_7.3-12         npsurv_0.4-0        withr_2.1.2
> [22] tidyselect_0.2.5    gridExtra_2.3       prettyunits_1.0.2
> [25] processx_3.3.0      curl_3.3            compiler_3.6.1
> [28] cli_1.1.0           htmlTable_1.13.1    randomNames_1.4-0.0
> [31] dvmisc_1.1.3        desc_1.2.0          tseries_0.10-46
> [34] scales_1.0.0        checkmate_1.9.1     lmtest_0.9-36
> [37] fracdiff_1.4-2      mvtnorm_1.0-10      quadprog_1.5-6
> [40] callr_3.2.0         stringr_1.4.0       digest_0.6.18
> [43] foreign_0.8-71      rio_0.5.16          base64enc_0.1-3
> [46] stocks_1.1.4        pkgconfig_2.0.2     htmltools_0.3.6
> [49] sessioninfo_1.1.1   readxl_1.3.1        htmlwidgets_1.3
> [52] rlang_0.3.4         TTR_0.23-4          rstudioapi_0.10
> [55] quantmod_0.4-14     MLmetrics_1.1.1     zoo_1.8-5
> [58] zip_2.0.1           acepack_1.4.1       dplyr_0.8.0.1
> [61] car_3.0-2           magrittr_1.5        Formula_1.2-3
> [64] Matrix_1.2-17       Rcpp_1.0.1          munsell_0.5.0
> [67] abind_1.4-5         stringi_1.4.3       forecast_8.6
> [70] yaml_2.2.0          carData_3.0-2       MASS_7.3-51.3
> [73] pkgbuild_1.0.3      plyr_1.8.4          grid_3.6.1
> [76] parallel_3.6.1      forcats_0.4.0       crayon_1.3.4
> [79] lattice_0.20-38     haven_2.1.0         splines_3.6.1
> [82] hms_0.4.2           knitr_1.22          ps_1.3.0
> [85] pillar_1.4.0        pkgload_1.0.2       urca_1.3-0
> [88] glue_1.3.1          lsei_1.2-0          babynames_1.0.0
> [91] latticeExtra_0.6-28 data.table_1.12.2   remotes_2.0.4
> [94] cellranger_1.1.0    testthat_2.1.0      gtable_0.3.0
> [97] purrr_0.3.2         assertthat_0.2.1    ggplot2_3.1.1
> [100] openxlsx_4.1.0      xfun_0.6            survey_3.35-1
> [103] survival_2.44-1.1   timeDate_3043.102   tibble_2.1.1
> [106] memoise_1.1.0       cluster_2.0.8       toOrdinal_1.1-0.0
> [109] fitdistrplus_1.0-14 brew_1.0-6
>
>
>
> Hope this helps,
>
> Rui Barradas
>
>
> Às 13:16 de 15/07/19, Duncan Murdoch escreveu:
>> On 07/07/2019 11:49 a.m., Ghiggi Gionata wrote:
>>> Hi all !
>>> 
>>> I noticed a strange behaviour of the function `class<-` when a 
>>> class-specific '[[.' method is defined.
>>> 
>>> Here below a reproducible example :
>>> 
>>> 
>>> #-------------------------------------------------------------------.
>>> 
>>> counttt <- 0
>>> 
>>> `[[.MYCLASS` = function(x, ...) {
>>>    counttt <<- counttt + 1
>>>    # browser()
>>>    x = NextMethod()
>>>    return(x)
>>> }
>>> 
>>> df <- as.data.frame(matrix(1:20, nrow=5))
>>> class(df) <- c("MYCLASS","data.frame")
>>> counttt
>>> 
>>> # The same occurs when using structure(, class=) or attr(,"class")<-
>>> df <- as.data.frame(matrix(1:20, nrow=5))
>>> df <- structure(df, class=c("MYCLASS","data.frame"))
>>> attr(df, "class") <- c("MYCLASS","data.frame")
>>> 
>>> #-------------------------------------------------------------------.
>>> 
>>> Why in this example `class<-` is calling  `[[.MYCLASS` 9 times ?
>>> 
>>> Is there a way to avoid `class<-` to call `[[.MYCLASS` ?
>>> 
>>> 
>>> Thank you in advance for your help and suggestions.
>> 
>> This is what I see:
>> 
>>
>>  > counttt <- 0
>>  >
>>  > `[[.MYCLASS` = function(x, ...) {
>> +   counttt <<- counttt + 1
>> +   # browser()
>> +   x = NextMethod()
>> +   return(x)
>> + }
>>  >
>>  > df <- as.data.frame(matrix(1:20, nrow=5))
>>  > class(df) <- c("MYCLASS","data.frame")
>>  > counttt
>> [1] 0
>> 
>> So there's something else going on in your system.  Maybe post 
>> sessionInfo()?
>> 
>> Duncan Murdoch
>> 
>> ______________________________________________
>> R-devel using r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

-- 
Luke Tierney
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa                  Phone:             319-335-3386
Department of Statistics and        Fax:               319-335-3017
    Actuarial Science
241 Schaeffer Hall                  email:   luke-tierney using uiowa.edu
Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu


More information about the R-devel mailing list