【发布时间】: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 说的是对的,你不应该把原来的函数搞乱,但是你可以创建自己的类似函数而不会有很大的性能损失,例如
"%+%" <- 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