【发布时间】:2020-05-28 18:18:55
【问题描述】:
有几种方法可以索引 i R 例如通过使用正整数进行选择,通过排除使用负整数,通过使用逻辑/条件进行选择,通过在命名向量或列表中使用名称(字符向量)进行选择,可能还有很多其他方式。
我想要的是一个接受两个输入ix 和lst 的函数,它告诉我ix 作为lst 的索引是否有意义,即lst[ix] 有意义。
我已经知道你可以做类似的事情
is.index <- function(ix,lst){
ans = FALSE
try({ans=all(!is.na(lst[ix]))},silent = TRUE)
return(ans)
}
但我希望它在列表包含NAs 时工作,而当它是lst 是一个列表时它的工作方式不同。这两种情况我可能很容易作为特殊情况处理,但我觉得我不知道所有可能的索引方式,以及这些的所有复杂性,所以我无法知道我是否已经全部钉牢特殊情况。
我知道“有意义”一词的定义并不明确,但在我看来,存在一个函数或至少有一种简单的方法来判断索引是否合理。
那么是否有一个函数或简单的方法可以做到这一点,而不是需要 try 或 try catch 语句的东西?
编辑:我意识到我在我的问题陈述中并不清楚。即使ix 是一个向量,我也想知道lst[ix] 是否有意义,而不是一个向量告诉我lst[ix[i]] 是否对i 的不同可能值有意义。无论ix 和lst 的类型如何,我们最好应该始终能够返回一个 逻辑值,即TRUE 或FALSE。例如,如果 lst = 1:5 和 ix = c(-1,2) 应该返回 FALSE 而不是 c(TRUE,TRUE)。
进一步澄清:我个人不喜欢部分匹配,或者通过非整数双精度进行索引是有意义的(我更不喜欢它只使用整数部分(而是例如四舍五入到最接近的整数(对小的精度误差)或发言(使lst[x/y] = lst[x%/%y])));但由于这对 R 有意义,我认为在这些情况下是否返回 TRUE 或 FALSE 应该取决于回答者的偏好。 lst[0] 和 lst[NA] 也是如此,而由于 list("Cheese" = 4)["Che"] 给出 NA,我认为不应该接受部分匹配。
但是看到(至少我认为)要求回答者做出自己的选择是不好的做法;如果我要选择,我认为所有这些(部分匹配除外)都应该被接受并返回为TRUE。
【问题讨论】:
-
正如您所说,“有意义”一词的定义不明确。这就是问题的症结所在。
idx=0、idx=NA或idx=1.2应该做什么?部分匹配呢?is.index(1:3, idx=4)或is.index(1:3, idx=1:4)或is.index(1, idx=-(F:T))呢?一旦你定义了所有边缘情况的预期行为,你就基本上编写了你想要的函数。 -
@dww :我意识到你可能是对的!我只是天真地希望你是不正确的! :)