2014-11-05 73 views
3

我正在尝试编写一个函数,该函数返回数字矢量,表示提供的x数字的n个十进制数字。这是我写到目前为止代码:从R中的数值获取数字的n大小矢量(仅限于R)

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

你可以在这里粘贴'gsub('\\ D',',as.character(x))''。 – jbaums 2014-11-05 15:40:09

+0

@jbaums是的,它帮助了NA。现在,我试图将结果表示为n大小的数字向量,但存在一些问题。 – oski86 2014-11-05 15:45:12

+0

你想对负值做什么?你想保留减号吗? – jbaums 2014-11-05 21:29:04

回答

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