Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 计算字符串:s=";开始=70结束=200步=5“;_R_String - Fatal编程技术网

R 计算字符串:s=";开始=70结束=200步=5“;

R 计算字符串:s=";开始=70结束=200步=5“;,r,string,R,String,我有一个来自外部文件的字符串: "start=70 end=200 step=5" 通常:它可以是具有任意数量参数的任何类似字符串。为了避免@Martin Mächler的愤怒,另请参见:输入格式已给定,我无法更改 以下是我的解决方案,使用no eval将其作为命名向量: s = "start=70 end=200 step=5" lazyeval::lazy_eval(paste0("c(", stringr::str_replace_all(s, " ", ","),")")) # sta

我有一个来自外部文件的字符串:

"start=70 end=200 step=5"
通常:它可以是具有任意数量参数的任何类似字符串。为了避免@Martin Mächler的愤怒,另请参见:输入格式已给定,我无法更改

以下是我的解决方案,使用no eval将其作为命名向量:

s = "start=70 end=200 step=5"
lazyeval::lazy_eval(paste0("c(", stringr::str_replace_all(s, " ", ","),")"))
# start   end  step 
#   70   200     5 

还有其他更安全、优雅或令人愉悦的选择吗?

相当麻烦,也不聪明,但没有eval,这有点说明了可能如何做到这一点

require(tidyr)

s <- "start=70 end=200 step=5"
s2 <- unlist(strsplit(s, " "))
s2 <- data.frame(s2) %>% separate(s2, c("name","value"), sep="=")
s <- s2$value
names(s) <- s2$name
正则表达式(带):


s使用scan()和base-R函数的另一种方法

s = "start=70 end=200 step=5"
sapply(scan(text=s,sep=" ",what=character(),quiet=T),
   function(x) { 
       x<-scan(text=x,sep="=",what=character(),quiet=T)
       setNames(as.numeric(x[2]),x[1]) },USE.NAMES = F)
s=“开始=70结束=200步骤=5”
sapply(扫描(text=s,sep=”“,what=character(),quiet=T),
函数(x){

席先想到这样的东西,但是S=“给了一个丑陋的”字符(0)“LasyyEvaly给出了NULL。我没有意识到有“敌对条件”需要考虑。也许在“输入格式被给予”的情况下,你可以提供更多的透视条件。例如,空字符串被认为是(现在明显的)。,也允许使用非赋值字符串吗?字符串赋值?在这条路径上太远的地方驻留着一个完整的解析器,我不喜欢在straight R中实现它。它在空字符串上很好地返回NULL是我在这里发布后才注意到的效果。根据我的经验和观点,我更喜欢
字符(0)
在这种情况下,因为它(1)告诉我结果应该是一个字符串,(2)它没有找到要返回的内容,所以给了我一个长度为0的向量。类似于,我找到一个空的
字符(0)
NULL
更有意义。无论哪种方式,在
gregexpr
之前添加一个条件以检查空输入字符串都应该很容易。s=”“和@r2evansey的问题相同。您可以尝试检查类似
if(grepl(=”,s)){执行脚本}或者{跳过},如果GRIPLL返回true,请考虑接受其中的一个答案。如果没有人解决你的问题,你能回到还没有工作的地方吗?我已经投票赞成了所有的答案,但没有接受任何一个,因为我发现我自己的解决方案是最好的。这当然是公平的……任何发布和接受的想法。你自己的答案?它可以丰富问题空间,或许可以帮助其他人。谢谢!(我真的不是散布观点,只是试图确保问题在未解决时正式结束或更新。)
s = "start=70 end=200 step=5"
sapply(scan(text=s,sep=" ",what=character(),quiet=T),
   function(x) { 
       x<-scan(text=x,sep="=",what=character(),quiet=T)
       setNames(as.numeric(x[2]),x[1]) },USE.NAMES = F)