В Wed, 18 Oct 2023 17:59:01 +0300 Leonard Mada via R-help <r-help@r-project.org> пишет:
> What is the best way to test for numeric digits? > > suppressWarnings(as.double(c("Li", "Na", "K", "2", "Rb", "Ca", "3"))) > # [1] NA NA NA 2 NA NA 3 > The above requires the use of the suppressWarnings function. Are > there any better ways? This test also has the downside of accepting things like "1.2" and "+1e-100". Since you need digits only, why not use a regular expression to test for '^[0-9]+$'? > I was working to extract chemical elements from a formula, something > like this: > split.symbol.character(c("CCl3F", "Li4Al4H16", "CCl2CO2AlPO4SiO4Cl")) Perhaps the following function could be made to work in your cases? function(x) regmatches(x, gregexec('([A-Z][a-z]*)([0-9]*)', x)) retval[2,] is the element and retval[3,] is the coefficient. Do you need brackets? Charges? Non-stoichiometric compounds? (SMILES?) > # broken in R 4.3.1 > # only slightly "erroneous" with stringi::stri_split > regex = "(?<=[A-Z])(?![a-z]|$)|(?=[A-Z])|(?<=[a-z])(?=[^a-z])"; > strsplit(c("CCl3F", "Li4Al4H16", "CCl2CO2AlPO4SiO4Cl"), regex, perl = > T) strsplit() has special historical behaviour about empty matches: https://bugs.r-project.org/show_bug.cgi?id=16745 It's unfortunate that it doesn't split on empty matches the way you would intuitively expect it to, but changing the behaviour at this point is hard. Even adding a flag may be complicated to implement. Do you want such a flag? -- Best regards, Ivan ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.