2

我对其他编程语言的期望是(1:4)[3:5]并且list(asdf = 4, qwerty = 5)$asdg都应该引发异常。相反,第一个静默返回c(3, 4, NA),第二个静默返回NULL(如 or 一样list(asdf = 4, qwerty = 5)[[asdg]])。

虽然这种行为有时会很有用,但更常见的是(根据我的经验),它会变成一个小错字、一个错误,或者无法在任何地方重命名变量,因为它从触发器中使用,以便立即轻松地使用-to-debug 错误,当静默传播NULL的 s 或NAs 最终被输入到一个对它们来说很响亮的函数或操作时,触发一个真正令人费解的错误,大约 20(或 200)步。(当然,这仍然比它根本不产生错误,只是垃圾结果的时候要好。)

data.frame()[,'wrong']给出一个错误,但data.frame()['wrong',]只返回NA.

我正在寻找的是一种方法来做向量/数组/列表/data.frame/等。如果我使用无效的索引,下标/成员访问将立即可靠地导致错误。对于列表,get('wrong', list())我正在寻找什么,但这有时会非常难看(特别是如果使用结果作为下标其他内容)。它是可用的,但更好的东西会很好。对于向量(和 data.frame rows),即使这样也行不通。

有没有好的方法来做到这一点?

4

1 回答 1

2

我不确定您是否可以全局更改此行为,但您可以根据数据类型根据需要单独处理它们。

例如,对于向量 -

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
于 2021-07-23T02:38:50.473 回答