簡體   English   中英

使用字符串創建數字向量

[英]Create a vector of numbers using character string

我花了很多時間來尋找解決方案,特別是在這個答案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 :10 保存為 object 而不是使用它作為我的輸入

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

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

有小費嗎? 謝謝

我們可以根據相鄰元素的diff創建一個分組列,然后在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

這是你想要達到的目標嗎?

> 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

作為 function:

> 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

你可以試試eval + str2lang

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM