在R中使用正则表达式嵌套if-else

问题描述 投票:0回答:1

我正在使用list of mathematical expressions。我已经确定了6种主要的表达模式。我正在使用正则表达式来过滤掉每个模式并将类似的表达式写入一个文件,如果任何表达式与任何正则表达式都不匹配,那么这些表达式将写入单独的文件(Log.txt)。

s1 =“(5.0 - 50.0)”

s2 =“((5.0 - 50.0) - 15.0)”

sz =“(15.0 - (5.0 - 50.0))”

MF =“((43.0 - 85.0)+(18.0 + 84.0))”

s5 =“(100.0 - ((5.0 - 57.0)+ 92.0))”

周六=“(((12.0 + 89.0) - 73.0) - (58.0 - 90.0))”

我尝试过使用嵌套的if-else和ifelse()。代码选取第一个模式并将其写入“ExpressionType1.txt”,然后它会出错。当模式与正则表达式不匹配时,它将不会转到else子句。下面的代码仅适用于两种类型的表达式。有没有其他方法可以使用if-else条件的正则表达式?

expressionList = read.table("expressionList.txt",header = T,sep = "\n")

for(i in 1:length(expressionList[,1])){

  currentExpression = as.character(expressionList[i,1])  

  ifelse(grepl("^\\(-?\\d+\\.\\d+\\s[\\+\\-\\*\\/]\\s-?\\d+\\.\\d+\\)$",currentExpression, perl = T),
         write(currentExpression,file="ExpressionType1.txt",append=TRUE),
    ifelse(grepl("^\\(\\(-?\\d+\\.\\d+\\s[\\+\\-\\*\\/]\\s-?\\d+\\.\\d+\\)\\s[\\+\\-\\*\\/]\\s-?\\d+\\.\\d+\\)$",currentExpression, perl = T),
                write(currentExpression,file="ExpressionType2.txt",append=TRUE), write(currentExpression,file="Log.txt",append=TRUE)
                        ))


}

嵌套if-else

  ifelse(grepl("^\\(-?\\d+\\.\\d+\\s[\\+\\-\\*\\/]\\s-?\\d+\\.\\d+\\)$",
          currentExpression, perl = T) == TRUE){

    write(currentExpression,file="ExpressionType1.txt",append=TRUE)

  } else if(grepl("^\\(\\(-?\\d+\\.\\d+\\s[\\+\\-\\*\\/]\\s-?\\d+\\.\\d+\\)\\s[\\+\\-\\*\\/]\\s-?\\d+\\.\\d+\\)$",
          currentExpression, perl = T) == TRUE){ 

    write(currentExpression,file="ExpressionType2.txt",append=TRUE)

  } else{
    write(currentExpression,file="Log.txt",append=TRUE)
  }

ans [test&ok]错误< - rep(是的,length.out = length(ans))[test&ok]:替换长度为零

另外:警告信息:

在rep(是的,length.out = length(ans)):

'x'为NULL,因此结果为NULL

r regex if-statement
1个回答
1
投票

如果你在这里和那里玩一些打印(替换它们而不是写函数),那么你会看到write函数出现问题并且否定了ifelse。

一个廉价的解决方案就是这样的。

for(i in 1:length(expressionList[,1])){ # i <- 1 
print(i)  
  currentExpression = as.character(expressionList[i,1])  
 enter1 = FALSE 
 enter2 = FALSE 
  if(grepl("^\\(-?\\d+\\.\\d+\\s[\\+\\-\\*\\/]\\s-?\\d+\\.\\d+\\)$",currentExpression, perl = T)){
         write(currentExpression,file="ExpressionType1.txt",append=TRUE)
    enter1 <- TRUE}
         # print('enter 1'),
         if(grepl("^\\(\\(-?\\d+\\.\\d+\\s[\\+\\-\\*\\/]\\s-?\\d+\\.\\d+\\)\\s[\\+\\-\\*\\/]\\s-?\\d+\\.\\d+\\)$",currentExpression, perl = T)){
                write(currentExpression,file="ExpressionType2.txt",append=TRUE)
           enter2 <- TRUE}

  if(enter1 == F & enter2 == F){ write(currentExpression,file="Log.txt",append=TRUE)}

         # print("enter 2"), print('enter 3')


}
© www.soinside.com 2019 - 2024. All rights reserved.