【问题标题】:Nested if-else with regex in R在R中使用正则表达式嵌套if-else
【发布时间】:2018-06-05 11:56:34
【问题描述】:

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

s1 = "(5.0 - 50.0)"

s2 = "((5.0 - 50.0) - 15.0)"

s3 = "(15.0 - (5.0 - 50.0))"

s4 = "((43.0 - 85.0) + (18.0 + 84.0))"

s5 = "(100.0 - ((5.0 - 57.0) + 92.0))"

s6 = "(((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] 中的错误

另外:警告信息:

在代表中(是的,length.out = length(ans)):

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

【问题讨论】:

标签: r regex if-statement


【解决方案1】:

如果您在这里和那里玩一些打印(替换它们而不是 write 函数),那么您会发现 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')


}

【讨论】:

  • 感谢您的回答。如果工作,我得到了嵌套。
  • 不客气,然后您可以投票并接受答案,以便问题结束:)
猜你喜欢
  • 2012-10-26
  • 2014-08-25
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多