我对其他编程语言的期望是 (1:4)[3:5]
和 list(asdf = 4, qwerty = 5)$asdg
都应该提出异常(exception)情况。相反,第一个默默地返回 c(3, 4, NA)
,第二个默默地返回 NULL
(如或 list(asdf = 4, qwerty = 5)[[asdg]]
)。
虽然这种行为偶尔有用,但更常见的是(根据我的经验),它会导致一个小拼写错误、相差一个错误,或者无法在触发器中使用的任何地方重命名变量。立即且易于调试的错误,当默默传播 NULL
或 NA
时,会触发大约 20(或 200)步的真正令人困惑的错误。最终被送入一个对它们来说很响亮的函数或操作中。 (当然,这仍然比根本不产生错误、只产生垃圾结果的时代要好。)
data.frame()[,'wrong']
给出错误,但 data.frame()['wrong',]
仅返回 NA
.
我正在寻找的是一种执行向量/数组/列表/data.frame/等的方法。如果我使用无效的索引,下标/成员访问将立即可靠地导致错误。对于列表, 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
关于r - 是否有一致的方法来强制错误列表或向量索引出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68493369/