【问题标题】:changing operator default behavior更改操作员默认行为
【发布时间】:2015-03-12 12:28:14
【问题描述】:

R 的默认行为的设计决策已针对交互式使用进行了微调,但可能会导致在没有太多用户监督的情况下运行的大型代码库中出现不良行为。我有兴趣找到使语言更加严格的方法。我有两个基本的例子。

(回收) 非全等向量在算术运算中被回收:

> x=1:10
> y=1:20
> y=rep(1,20)
> x+y
 [1]  2  3  4  5  6  7  8  9 10 11  2  3  4  5  6  7  8  9 10 11

有没有办法让这个操作导致错误?

(conversion) 更新向量时会发生转换,有时会更改被更新元素的类型,有时会更改向量的类型:

> x[1] <- 'a'
> x
 [1] "a"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"
> x[1] <- 1
> x
 [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"

有没有办法让这个操作导致错误?

我相信新用户和中级用户的许多挫败感源于此类行为(这反过来会导致对语言的总结判断!)。非常欢迎任何指向解决回收和转换的一般方法的指针。

【问题讨论】:

  • 回收和转换是语言的核心属性。两者都是在 C 级别实现的。恕我直言,改变这一点通常需要更改基本源代码并重建 R。这将是一项不平凡的任务,并且可以预期会破坏许多其他功能。例如,您可以为某些类编写 + 方法来测试输入是否相同长度,但这会带来显着的性能成本,而且您似乎有更笼统的想法。
  • Roland 说的是对的,你不应该把原来的函数搞乱,但是你可以创建自己的类似函数而不会有很大的性能损失,例如"%+%" &lt;- function(x, y) {stopifnot(length(x) == length(y)) ; `+`(x, y)} 然后你可以测试它x %+% y
  • 对于回收,您可以查看this question and its comments。看起来不可能改变这个基本的 R 特性。
  • 请注意(1:5) + 1 也使用回收。大概你不会想要一个错误。
  • 对于会发出警告的情况,您可以使用options(warn = 2) 来获取错误。这不足以满足您的需求,但它是在防止某些问题方面向前迈出的一步。请参阅?warning 了解更多信息。

标签: r


【解决方案1】:

用于添加。大卫是对的。在合理的代码上,我会在函数入口处或至少在结尾处检查这类事情:

    require(testthat)
    expect_equal(length(out), length (mainEntry))

转换也是一个非常敏感的问题。在重要的代码中,我指定了赋值的类型:

    X[1] <- as.numeric("a")

会发出警告。 您甚至可以使用S4 classes 定义阻止转换的类。

不幸的是,对于初学者来说,这可能不太容易理解,但初学者是否应该处理关键代码?

【讨论】:

    猜你喜欢
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多