【问题标题】:Setting equivalent of .subset2 in R?在R中设置等效于.subset2?
【发布时间】:2021-11-17 18:07:18
【问题描述】:

在 R 中,我可以使用 .subset2 充当 [[$ 而无需调度。

> a <- new.env()
> a$foo  <- 3
> .subset2(a, "foo")
[1] 3

但是,如果没有调度,我似乎找不到设置操作的等效项:

> .subset2(a, "foo") <- 5

.subset2(a, "foo")

如何在不使用 [[&lt;-$&lt;- 运算符的隐式调度的情况下进行设置?

【问题讨论】:

  • 这些有什么问题?如果没有某种.subset2&lt;-(),你想要实现什么?
  • @mnist 没有 .subset2
  • @mnist 我正在尝试覆盖某些 R6 类的美元行为。如果有调度,我进入递归。
  • “我正在尝试覆盖某些 R6 类的美元行为。”这是否意味着您打算屏蔽$&lt;- 函数?这可能会产生一些严重的性能影响。我建议不要屏蔽 .Primitive 函数。
  • @Roland 我不在乎性能。我希望在引用不存在的内容时引发错误。你们 R 人太在意性能了

标签: r subset r6


【解决方案1】:

我不完全确定这是您所追求的,但它确实满足在 a 环境中设置 foo 值的先决条件,而无需明确使用 $[[[&lt;- 运营商:

# Your code:
a <- new.env()
a$foo  <- 3
.subset2(a, "foo")
# Solution:
list2env(
  list(
    foo = 5
  ), 
  env = a
)
# Proof:
a$foo

【讨论】:

    【解决方案2】:

    您可能正在寻找assign:

    说明:为环境中的名称赋值。

    assign("foo", 5, envir = a)
    

    顺便说一句,您可能想使用get,而不是使用.subset2(这是基本包中的内部函数,可能会与subset混淆):

    get("foo", envir = a)
    # [1] 5
    

    【讨论】:

      【解决方案3】:

      也许我们可以试试

      with(a,assign("foo",5))
      

      with(a, `<-`(foo, 5))
      

      a$foo <- 5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-08
        • 2017-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多