我正在处理一个数学表达式列表。我已经确定了 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] <- rep(yes, length.out = length(ans))[test & ok] 中的错误:替换长度为零
另外: 警告信息:
在 rep(yes, length.out = length(ans)) 中:
'x' 为 NULL,因此结果将为 NULL
如果你在这里和那里玩一些打印(替换它们而不是写函数),那么你会看到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')
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句