Если вы передадите большее число, чем 1
, к sample
, эту проблему легче будет векторизовать.
Одна вещь, которая в настоящее время делает вашу проблему намного сложнее, - это расположение таблицы unit_names
: вы эффективно рассматривают мужские и женские имена как индивидуально спаренные, но они явно не совпадают: следовательно, они не должны быть в столбцах одной и той же таблицы. Используйте список из двух векторов, например:
unit_names = list(
Women = c("fem1", "fem2", "fem3", "fem4", "fem5", "fem6", "fem7"),
Men = c("male1", "male2", "male3", "male4", "male5")
)
Затем вы можете сгенерировать случайные имена для удовольствия вашего сердца:
generate_names = function (n, unit_names) {
name_length = sample(2 : 4, n, replace = TRUE)
genders = sample(c('Women', 'Men'), n, replace = TRUE)
names = Map(sample, unit_names[genders], name_length, replace = TRUE) %>%
lapply(paste, collapse = ' ') %>%
unlist()
tibble(`Full name` = names, Gender = genders)
}
Примечание о стиле, в отличие от вашей функции, приведенной выше не используйте глобальные переменные. Кроме того, не заключайте в кавычки имена переменных (вы делаете это в unit_names$"Women"
и для аргументов add_row
). R допускает это, но это, возможно, ошибка в спецификации языка: это , а не строки , это имена переменных, из-за чего они выглядят как строки, вводящие в заблуждение. В конце концов, вы не цитируете имена других переменных. Вам do необходимо заключить в кавычки имя столбца `Full name`
, поскольку оно содержит пробел. Однако использование обратных кавычек вместо кавычек означает, что это имя переменной.