bigq 向量的名称(R 包 gmp)
Names of bigq vectors (R package gmp)
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
class 定义了一个 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
。
通过索引提取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
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
class 定义了一个 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
。
通过索引提取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