Надежное решение:
# convert vector of strings into list of vectors of words
words = strsplit(name, ' ', fixed = TRUE)
str_rev = sapply(words, function(x) {
# we know some warnings may be created, ignore them
suppressWarnings({
is_num = !is.na(as.numeric(x))
})
# reverse non-numeric elements
str_words = strsplit(x[!is_num], "", fixed = TRUE)
x[!is_num] = sapply(str_words, function(y) {
paste(rev(y), collapse = "")
})
paste(x, collapse = ' ')
})
Это позволяет применять правило в более общих случаях, когда вы не знаете, где появится числовое "слово", а name
- как вектор:
name = c("abcdef 123", 'abc def 123', 'abc 123 def')
str_rev
# [1] "fedcba 123" "cba fed 123" "cba 123 fed"