我正在尝试编写一个函数,它返回一个数字向量,表示所提供的x数字的n个十进制数字。这是我到目前为止编写的代码:
decdig <- function(x, n){
stopifnot(is.numeric(x))
stopifnot(is.integer(n))
head ( lapply(strsplit( as.character(x) , ""), as.numeric) , n)
}
所以说明:
decdig(pi,10L)
返回:
[[1]]
[1] 3 NA 1 4 1 5 9 2 6 5 3 5 8 9 7 9
但应该是:
3 1 4 1 5 9 2 6 5 3
这意味着它应该生成数字向量而不进行舍入。
由于逗号,我有一个问题就是摆脱那里的NA值。我试图让它尽可能优雅,而不使用控制流机制。
任何想法都赞赏。
答案 0 :(得分:1)
这是一种方法:
decdig <- function(x, n) {
stopifnot(is.numeric(x))
stopifnot(is.integer(n))
z <- sub('\\D', '',
sprintf(paste0('%.', n - nchar(abs(floor(x))) + 2, 'f'), x))
head((strsplit(z, '')[[1]]), n)
}
decdig(pi, 10L)
# [1] 3 1 4 1 5 9 2 6 5 3
我们通过从n
中减去前导位数来计算所需的小数位数(如果有的话),然后将其传递给sprtinf
以强制x
为具有该数字的字符小数位数。然后我们分出非数字字符(应该只包括,
或.
,具体取决于区域设置)。然后我们将每个角色分开并强制转换为numeric
。