Generating Cartesian product of strings in R
Your approach is an example of good R code. However, there is a base function that allows creating a cartesian product of strings, interaction. This function creates a factor, and the levels are equivalent to the cartesian product.

Furthermore, instead of paste(..., sep = "") you can use paste0(...).

If you use these functions, your code will be much shorter:

combine &lt;- function(..., prefix = "", sep = "_") {
  paste0(prefix, levels(interaction(..., sep = sep)))
}


Examples:

s1 &lt;- c('europe', 'asia')
s2 &lt;- c('co2', 'temperature')
s3 &lt;- c('min', 'max')

combine(s1)
# [1] "europe" "asia"  
combine(s1, s2)
# [1] "europe_co2"         "europe_temperature" "asia_co2"           "asia_temperature"  
combine(s1, s2, s3)
# [1] "europe_co2_min"         "europe_co2_max"         "europe_temperature_min"
# [4] "europe_temperature_max" "asia_co2_min"           "asia_co2_max"          
# [7] "asia_temperature_min"   "asia_temperature_max"