【问题标题】:Is there an R function for checking if a value is a legal index in a vector or list?是否有用于检查值是否是向量或列表中的合法索引的 R 函数?
【发布时间】:2020-05-28 18:18:55
【问题描述】:

有几种方法可以索引 i R 例如通过使用正整数进行选择,通过排除使用负整数,通过使用逻辑/条件进行选择,通过在命名向量或列表中使用名称(字符向量)进行选择,可能还有很多其他方式。 我想要的是一个接受两个输入ixlst 的函数,它告诉我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 的不同可能值有意义。无论ixlst 的类型如何,我们最好应该始终能够返回一个 逻辑值,即TRUEFALSE。例如,如果 lst = 1:5ix = c(-1,2) 应该返回 FALSE 而不是 c(TRUE,TRUE)

进一步澄清:我个人不喜欢部分匹配,或者通过非整数双精度进行索引是有意义的(我更不喜欢它只使用整数部分(而是例如四舍五入到最接近的整数(对小的精度误差)或发言(使lst[x/y] = lst[x%/%y])));但由于这对 R 有意义,我认为在这些情况下是否返回 TRUEFALSE 应该取决于回答者的偏好。 lst[0]lst[NA] 也是如此,而由于 list("Cheese" = 4)["Che"] 给出 NA,我认为不应该接受部分匹配。

但是看到(至少我认为)要求回答者做出自己的选择是不好的做法;如果我要选择,我认为所有这些(部分匹配除外)都应该被接受并返回为TRUE

【问题讨论】:

  • 正如您所说,“有意义”一词的定义不明确。这就是问题的症结所在。 idx=0idx=NAidx=1.2 应该做什么?部分匹配呢? is.index(1:3, idx=4)is.index(1:3, idx=1:4)is.index(1, idx=-(F:T)) 呢?一旦你定义了所有边缘情况的预期行为,你就基本上编写了你想要的函数。
  • @dww :我意识到你可能是对的!我只是天真地希望你是不正确的! :)

标签: r indexing


【解决方案1】:

以下内容似乎可以完成这项工作。它使用部分匹配来匹配字符ix 与向量或列表名称。

is.index <- function(X, ix){
  if(is.character(ix)){
    if(is.null(names(X))) FALSE
    !is.na(pmatch(ix, names(X)))
  }else{
    abs(ix) <= length(X)
  }
}

用向量进行测试。

x <- 1:6
y <- setNames(x, letters[x])
is.index(x, 2)
is.index(x, 7)
is.index(x, -3)
is.index(y, 'a')
is.index(y, 'z')

现在有了列表。

lst <- list(1:6, letters[1:4])
is.index(lst, 3)
is.index(lst, "a")
is.index(lst, -1)

但是有问题,部分匹配只适用于$提取函数,它不适用于[[,甚至不适用于[

lst2 <- setNames(lst, c("A", "2nd"))
is.index(lst2, "A")

is.index(lst2, "2n")
lst2$`2n`              # works
lst[['2n']]            # fails

【讨论】:

    猜你喜欢
    • 2021-07-17
    • 2022-12-13
    • 2019-08-18
    • 2022-11-30
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多