R 为什么;如果一个对象有两个绑定,其中一个绑定消失,则引用计数不会返回到1";?

R 为什么;如果一个对象有两个绑定,其中一个绑定消失,则引用计数不会返回到1";?,r,R,Advanced R 2019介绍了对象的“修改时复制”。然后是一些例外情况(就地修改): 如果一个对象绑定了一个名称,R将在适当的位置对其进行修改 当R应用此优化时,有两个复杂因素可以准确预测 挑战性: 在绑定方面,R当前只能计算0、1或多个。那个 这意味着如果一个对象有两个绑定,其中一个没有绑定,则引用 计数不会回到1:少一个仍然是多的。反过来,这个 这意味着,R有时不需要复制时将进行复制 以下两句话互相矛盾吗 “R当前只能计数0、1或多个” 如果一个对象有两个绑定,其中一个没有绑定

Advanced R 2019介绍了对象的“修改时复制”。然后是一些例外情况(就地修改):

如果一个对象绑定了一个名称,R将在适当的位置对其进行修改

当R应用此优化时,有两个复杂因素可以准确预测 挑战性:

  • 在绑定方面,R当前只能计算0、1或多个。那个 这意味着如果一个对象有两个绑定,其中一个没有绑定,则引用 计数不会回到1:少一个仍然是多的。反过来,这个 这意味着,R有时不需要复制时将进行复制

以下两句话互相矛盾吗

  • “R当前只能计数0、1或多个”

  • 如果一个对象有两个绑定,其中一个没有绑定,则引用 计数并没有回到1:比多少一个仍然是多的,并且“R会在有时不需要的时候复制”

谢谢

假设“R当前只能计数0、1或多个”,则 有两个绑定,一个会消失“,为什么”引用计数会消失 不回到1:少一还是多”

命名机制统计可从中访问对象的变量数量,只允许值0,1,2(“2”表示“2或更多”)

还有“R有时不需要复制时会复制”

如果允许更多的值或使用R,则不需要对这些副本进行适当的参考计数


因此,超过1的引用计数(有助于减少复制)可能会在某个时候实现

我不确定这句话是否正确。让我们用<代码>查看内部(检查())< /代码> ./P> 考虑按以下方式分配:

x <- 1L
x[[1]] <- 2L
x
#[1] 2
根据
[NAM(1)]
我们可以看到,只有一个符号表示地址
7fa684891478

现在让我们将
x
分配给
y

y <- x
.Internal(inspect(y))
#@7fa684891478 13 INTSXP g0c1 [NAM(2)] (len=1, tl=0) 2
.Internal(inspect(x))
#@7fa684891478 13 INTSXP g0c1 [NAM(2)] (len=1, tl=0) 2
不管怎样,即使我们删除指向
7fa684891478
[NAM()]
的符号,也不会向下递增

rm(z)
.Internal(inspect(x))
#@7fa684891478 13 INTSXP g0c1 [NAM(3)] (len=1, tl=0) 2
z <- x
.Internal(inspect(x))
#@7fa684891478 13 INTSXP g0c1 [NAM(3)] (len=1, tl=0) 2
rm(z)
.Internal(inspect(x))
#@7fa684891478 13 INTSXP g0c1 [NAM(3)] (len=1, tl=0) 2
R.Version()
#...
#$version.string
#[1] "R version 3.6.3 (2020-02-29)"