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()
将无济于事。
我正在 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()
将无济于事。