大整数向量的名称(R包gmp)

3
< p > gmp R软件包的bigq向量的names函数不像人们期望的那样工作:

> library(gmp)
> x <- as.bigq(c(0.5,0.5))
> names(x) <- c("a", "b")
> names(x)
 [1] "a" "b" NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 

因此,我为bigq类定义了一个names函数,如下所示,它可以正常工作:
> names.bigq <- function(x) attr(x, "names")[1:length(x)]
> names(x)
[1] "a" "b"

即使使用 names(x) <-setNames 也可以很好地与 names.bigq 函数一起使用。但是,通过名称访问向量的元素不起作用:

> x["a"]
bigq(0)

有没有办法让它工作?如果x["a"]x[which(names(x)=="a")]相同,那就没问题了:

> x[which(names(x)=="a")]
Big Rational ('bigq') :
[1] 1/2

注意:一种可能的解决方法是将x转换为字符模式,然后再转回来。

1个回答

2
提取 bigq 向量或矩阵中元素的函数是内部的 `[.bigq` 函数。它能够根据索引值进行提取。
> gmp:::`[.bigq`
function (x, i = NULL, j = NULL, drop = TRUE) 
{
    .Call(matrix_get_at_q, x, i, j)
}
<environment: namespace:gmp>

然后用下面这个覆盖它:
`[.bigq` <- function (x, i = NULL, j = NULL, drop = TRUE) 
{
  if(is.character(i)){ i <- which(names(x)==i) }
  .Call(gmp:::matrix_get_at_q, x, i, j)
}

它可以工作:

> x <- as.bigq(c(2,5))
> names(x) <- c("a", "b")
> x[1]
Big Rational ('bigq') :
[1] 2
> x["a"]
Big Rational ('bigq') :
[1] 2

更好的方案:

`[.bigq` <- function (x, i = NULL, j = NULL, drop = TRUE) 
{
  if(is.character(i)){ i <- sapply(i, function(k) which(names(x)==k), USE.NAMES=FALSE) }
  .Call(gmp:::matrix_get_at_q, x, i, j)
}

获取:

> x[c("a","b")]
Big Rational ('bigq') object of length 2:
[1] 1 2
> x[c("b","a")]
Big Rational ('bigq') object of length 2:
[1] 2 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接