R6 — 为什么主动绑定在使用打印功能时会打印两倍的内容?

R6 — Why does active binding print twice the content when using the print function?

我正在 R6 class 中创建活动绑定以打印私有元素。

当我调用 print(private$privMail) 时,结果打印了两次,但只打印在私有元素上,而不是 public。

如果我不使用 print,没问题。

这是一个代表:

team <- R6::R6Class("Team",
                public = list( mail = "colin@thinkr.fr"),
                private = list(privMail = "colin@thinkr.fr"), 
                active = list(
                  MailPriv = function(){ print(private$privMail) },
                  Mail = function(){ print(self$mail) }
                )
)
a <- team$new()
a$MailPriv
#> [1] "colin@thinkr.fr"
#> [1] "colin@thinkr.fr"
a$Mail
#> [1] "colin@thinkr.fr"
#> [1] "colin@thinkr.fr"
#Without using print 
team2 <- R6::R6Class("Team",
                    public = list( mail = "colin@thinkr.fr"),
                    private = list(privMail = "colin@thinkr.fr"), 
                    active = list(
                      MailPriv = function(){ private$privMail },
                      Mail = function(){self$mail }
                    )
)
abis <- team2$new()
abis$MailPriv
#> [1] "colin@thinkr.fr"
abis$Mail
#> [1] "colin@thinkr.fr"


devtools::session_info()
#> Session info -------------------------------------------------------------
#>  setting  value                       
#>  version  R version 3.4.4 (2018-03-15)
#>  system   x86_64, darwin15.6.0        
#>  ui       X11                         
#>  language (EN)                        
#>  collate  fr_FR.UTF-8                 
#>  tz       Europe/Paris                
#>  date     2018-05-24
#> Packages -----------------------------------------------------------------
#>  package   * version date       source                          
#>  backports   1.1.2   2017-12-13 CRAN (R 3.4.3)                  
#>  base      * 3.4.4   2018-03-15 local                           
#>  compiler    3.4.4   2018-03-15 local                           
#>  datasets  * 3.4.4   2018-03-15 local                           
#>  devtools    1.13.5  2018-02-18 CRAN (R 3.4.3)                  
#>  digest      0.6.15  2018-01-28 CRAN (R 3.4.3)                  
#>  evaluate    0.10.1  2017-06-24 CRAN (R 3.4.1)                  
#>  graphics  * 3.4.4   2018-03-15 local                           
#>  grDevices * 3.4.4   2018-03-15 local                           
#>  htmltools   0.3.6   2017-04-28 CRAN (R 3.4.0)                  
#>  knitr       1.20    2018-02-20 CRAN (R 3.4.3)                  
#>  magrittr    1.5     2014-11-22 CRAN (R 3.4.0)                  
#>  memoise     1.1.0   2017-04-21 CRAN (R 3.4.0)                  
#>  methods   * 3.4.4   2018-03-15 local                           
#>  R6          2.2.2   2017-06-17 CRAN (R 3.4.0)                  
#>  Rcpp        0.12.16 2018-03-13 CRAN (R 3.4.4)                  
#>  rmarkdown   1.9     2018-03-01 CRAN (R 3.4.3)                  
#>  rprojroot   1.3-2   2018-01-03 CRAN (R 3.4.3)                  
#>  stats     * 3.4.4   2018-03-15 local                           
#>  stringi     1.1.7   2018-03-12 CRAN (R 3.4.4)                  
#>  stringr     1.3.0   2018-02-19 CRAN (R 3.4.3)                  
#>  tools       3.4.4   2018-03-15 local                           
#>  utils     * 3.4.4   2018-03-15 local                           
#>  withr       2.1.2   2018-04-13 Github (jimhester/withr@79d7b0d)
#>  yaml        2.1.18  2018-03-08 CRAN (R 3.4.4)

编辑

准确地说,我的问题不是关于如何解决这个问题(我可以通过删除打印来解决,就像在第二个 class 中所做的那样),而是关于为什么使用 print()打印两倍的内容。

我不确定我是否完全理解你的问题,但我认为你有一份来自 print 的打印件和一份来自 print.

的返回元素

尝试例如(print(1)).

所以,基本上,我会删除这里的 print

print returns 它打印的值,试试这个修改后的版本:

team <- R6::R6Class("Team",
                    public = list( mail = "colin@thinkr.fr"),
                    private = list(privMail = "colin@thinkr.fr"), 
                    active = list(
                        MailPriv = function(){ print(private$privMail); "hi!" },
                        Mail = function(){ print(self$mail) }
                    )
)
a <- team$new()
> a$MailPriv
[1] "colin@thinkr.fr"
[1] "hi!"

显然活动绑定不支持invisible, 所以将 "hi!" 更改为 invisible() 将无济于事。