使用字符串创建数字向量

时间:2021-04-07 17:32:41

标签: r

我花了很多时间来寻找解决方案,特别是在这个答案中Use character string as function argument

反正我还没有找到解决方案。

我会使用一串字符,因为它是我在控制台中的输入。

特别是,我可以通过这种方式创建向量 v1

v1 <- c(1, 3, 5:10)

[v1] 1 3 5 6 7 8 9 10

我想找到一种方法,通过将此代码 1, 3, 5:10 保存为对象而不是将其用作我的输入

values <- ("1, 3, 5:10")

v1 <- c(read.as.input(values))

有什么建议吗?谢谢

3 个答案:

答案 0 :(得分:2)

我们可以根据相邻元素的difference创建一个分组列,然后在tapply中使用该组,以paste

toString(tapply(v1, cumsum(c(TRUE, diff(v1) != 1)), 
   FUN = function(x) if(length(x) > 1) paste(range(x), collapse=":") else x))
#[1] "1, 3, 5:10"

如果相反

values <- c("1, 3, 5:10")
unlist(lapply(strsplit(values, ",\\s*")[[1]],
   function(x) eval(parse(text = x))), use.names = FALSE)
#[1]  1  3  5  6  7  8  9 10

答案 1 :(得分:2)

这是你想要达到的目标吗?

> a = "1, 3, 5:10"
> b = paste0("c(", a, ")") # paste characters inside c() to parse afterwards
> b
[1] "c(1, 3, 5:10)"
> eval(parse(text = b)) # parse it..
[1]  1  3  5  6  7  8  9 10

作为函数:

> read.as.input <- function(input_text) {
 +     input_text = paste0("c(", input_text, ")")
 +     result = eval(parse(text = input_text))
 +     return(result)
 + }
> read.as.input("1,3,5:10")
[1]  1  3  5  6  7  8  9 10

答案 2 :(得分:2)

你可以试试eval + str2lang

> eval(str2lang(sprintf("c(%s)", values)))
[1]  1  3  5  6  7  8  9 10
相关问题