В рамках более крупной функции для сохранения значений только во временном ряду роста растений, которые происходят до травмы для каждого человека (plantid
), я пишу 2 фрагмента, которые по порядку будут содержать функцию
Управляйте тем, что все переменные, указанные в аргументе, являются векторами символов (как и во второй функции,
%in%
не распознает названные факторы), и если нет, преобразовать в символ, выдавая предупреждение.Определите и отметьте строки из указанных выше переменных, которые включают одну из строк из аргумента
b
.
Я совершенно уверен, что что-то не так с операторами цитаты / квазиквотации или bang-bang (_4 _) / big-bang (!!!
) (я впервые пишу функцию с цитатой). Мне постоянно выдаются предупреждения «!!!
нельзя использовать на верхнем уровне» или тому подобное, и я не знаю, как решить эту проблему. Мне также нужна помощь в поиске хорошего способа преобразовать переменные, не являющиеся символами.
Это то, что у меня есть
Описание аргумента
df
: data.frameplantid
: уникальный идентификатор для каждого отдельного растенияyear
: год наблюденияinjuries
: список из (в моем случае) 3 столбцов, которые могут содержать код травмы, напримерc("PrimaryInjury", "SecondaryInjury", "OtherInjury")
forbidden_values
: интересующие коды травм, напримерc("Rust", "Insect", "Snow break")
Функция
id_injured <- function(df, plantid, year, injuries, forbidden_values){
#parsing unquoted strings.
plantid <- enquo(plantid)
year <- enquo(year)
forbidden_values <- enquos(forbidden_values)
injuries <- syms(injuries)
#if all variables in injuries are not characters, stop and warn (attempt to convert to character those variables which are not character)
if(!all(purrr::pmap_int(select(df, !!!injuries), ~is.character(...))))){
stop("All injury variables are not characters. Convert factors in injuries to character variables")} else {
(1) #Control to give output while testing function, replace with conversion and warning?
}
#Identify rows with matching injury codes with 1, else 0.
Dataplantid <- df %>% mutate(is_injured = purrr::pmap_int(select(df, !!!injuries), any(c(...) %in% !!!forbidden values)))
#End of function
}
Использование по назначению
Я удалил часть (1) функции, поэтому она будет пытаться пометить только 1 или 0.
Dataplantid <- id_injured(df=df, plantid=plantid, year=year, injuries=c("PrimaryInjury","SecondaryInjury","OtherInjury"),forbidden_values=c("Rust","Insect","Snow break")
Результат
Ошибка: невозможно использовать
!!!
на верхнем уровне.
> last_trace()
<error/rlang_error>
Can't use `!!!` at top level.
Backtrace:
█
1. └─global::so_injured(...)
2. └─`%>%`(...)
3. ├─base::withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
4. └─base::eval(quote(`_fseq`(`_lhs`)), env, env)
5. └─base::eval(quote(`_fseq`(`_lhs`)), env, env)
6. └─`_fseq`(`_lhs`)
7. └─magrittr::freduce(value, `_function_list`)
8. ├─base::withVisible(function_list[[k]](value))
9. └─function_list[[k]](value)
10. ├─dplyr::mutate(...)
11. └─dplyr:::mutate.data.frame(...)
12. ├─base::as.data.frame(mutate(tbl_df(.data), ...))
13. ├─dplyr::mutate(tbl_df(.data), ...)
14. └─dplyr:::mutate.tbl_df(tbl_df(.data), ...)
15. └─rlang::enquos(..., .named = TRUE)
16. └─rlang:::endots(...)
17. └─rlang:::map(...)
18. └─base::lapply(.x, .f, ...)
19. └─rlang:::FUN(X[[i]], ...)
20. └─rlang::splice(...)
Связанные данные
plantid <- rep(c(1,2,3,4,5), times=c(3,3,3,3,3))
year <- rep(1:3, length.out=length(plantid))
set.seed(42)
PrimaryInjury <- sample(c(NA,NA,NA,"Rust","Insect", "Snow break"), 15, replace=TRUE)
SecondaryInjury <- rep(NA, length.out=length(plantid)) #Filled with NA for example
OtherInjury <- rep(NA, length.out=length(plantid)) #Filled NA for example
df <- data.frame(plantid,year,PrimaryInjury,SecondaryInjury,OtherInjury)
#Right now, PrimaryInjury is a factor, SecondaryInjury and OtherInjury are logical.
Ожидаемый результат
Dataplantid <- df
Dataplantid$is_injured <- c(0,1,0,0,0,1,0,0,0,1,0,1,1,1,0)
mutate()
сifelse()
. Кроме того, проблема не воспроизводится, поскольку вы не показали, как вы использовали эту функцию. - person MKR   schedule 24.03.2020Error in c(...) %in% list(~c("Rust", "Insect", "Snow break")) : '...' used in an incorrect context
- person Silviculturalist   schedule 24.03.2020c(...)
? Тем не менее, это не то сообщение об ошибке, которое я получаю после исправления очевидных синтаксических ошибок в опубликованном вами коде. - person Konrad Rudolph   schedule 24.03.2020purrr::pmap_int(select(df, !!!injuries), any(c(...) %in% !!!forbidden values))
читается как с каждой из переменных в травмах Список векторов, совпадает ли какое-либо из них в списке запрещенных_значений? Мое намерение с кодом состоит в том, чтобы он отмечал любые положительные совпадения в строке, установленной как 1, иначе 0. - person Silviculturalist   schedule 24.03.2020