我对其他编程语言的期望是(1:4)[3:5]
和list(asdf = 4, qwerty = 5)$asdg
都应该引发异常。相反,第一个静默地返回c(3, 4, NA)
,第二个静默地恢复NULL
(与list(asdf = 4, qwerty = 5)[[asdg]]
一样(。
虽然这种行为偶尔会很有用,但更多时候(根据我的经验(,它会将一个小的拼写错误、一个错误导致的关闭,或在使用变量的任何地方都无法重命名变量,从一个立即且易于调试的错误的触发器,变成一个真正令人困惑的错误的触发,大约20(或200(步后,当无声传播的CCD_ 6 s或CCD_。(当然,这仍然比它根本不产生错误,只是垃圾结果的时候要好。(
data.frame()[,'wrong']
给出一个错误,但data.frame()['wrong',]
只返回NA
。
我正在寻找一种进行vector/array/list/data.frame/etc.subscripting/member访问的方法,如果我使用无效的索引,该方法将可靠地立即导致错误。对于列表,get('wrong', list())
可以实现我想要的功能,但这有时会很难看(尤其是在使用结果作为下标其他内容时(。它是可用的,但更好的就好了。对于向量(和data.frame行(,即使这样也不起作用。
有什么好方法可以做到这一点吗?
我不确定您是否可以全局更改这种行为,但您可以根据数据类型根据需要单独处理它们。
例如,对于矢量-
subset_values <- function(x, ind) {
if(min(ind) > 0 && max(ind) <= length(x)) x[ind]
else stop('Incorrect length')
}
subset_values(1:4, 3:5)
#Error in subset_values(1:4, 3:5) : Incorrect length
subset_values(1:4, -1:3)
#Error in subset_values(1:4, -1:3) : Incorrect length
subset_values(1:4, 1:3)
#[1] 1 2 3