我有一个分子式 "C5Cl2NO2S",想在 R 中计算其分子量。我认为最简单的方法是使用正则表达式将公式分解成其元素组件,并将它们传递给另一个执行计算的函数。然而,我遇到了问题,当我传递我的正则表达式的回溯引用时,它们不会被求值,而是作为 "\\1"、"\\2" 被传递。
以下是我的尝试:
有什么想法可以改进这个?非常感谢。
以下是我的尝试:
masses <- list(
C = 12,
H = 1.01,
Cl = 34.97,
N = 14.00,
O = 15.99,
P = 30.97,
S = 31.97
)
elementMass <- function( element, count ) {
if( count == "" ) {
count <- "1"
}
return( as.character( masses[[ element ]] * as.numeric( count ) ) )
}
sumFormula2Mass <- function( x ){
y <- 0.0
for( e in x ) {
if( e != "" ) {
y <- y + as.numeric( sub( "^(C|H|Cl|N|O|P|S)([0-9]*)$", elementMass("\\1", "\\2"), e ) )
}
}
return( y )
}
sub(
"^(C[0-9]*)?(H[0-9]*)?(Cl[0-9]*)?(N[0-9]*)?(O[0-9]*)?(P[0-9]*)?(S[0-9]*)?$",
sumFormula2Mass( c("\\1", "\\2", "\\3", "\\4", "\\5", "\\6", "\\7") ),
"C5Cl2NO2S"
)
有什么想法可以改进这个?非常感谢。
unlist( strsplit( sub( ..., replacement="\\1#\\2\\#3\\4# ... ", ... ), split="#" ) )
找到了我的解决方案。虽然不是很优雅,但很有效 :-) - Beasterfield