簡體   English   中英

R:在使用 dplyr 的 function 中,如何檢查以確保在繼續之前未引用參數名稱?

[英]R: In a function using dplyr, how do I check to make sure that an argument name is not quoted before proceeding?

長話短說:我有一個 function 參數grouping.var = record_id可以工作,但grouping.var = "record_id"將返回不正確的數據而沒有錯誤。 所以我希望我的 function 檢查傳遞給參數的名稱是否不在引號中。

長話短說:我經常有數據,每個研究對象都會有多次訪問,每次訪問對應一行。 一些在訪問之間不會改變的數據(例如種族或性別)只出現在一行上。 我的 function 會將數據從我提供的變量復制到該主題的所有行。

mash <- function(data, variables, grouping.var){
   data <- data %>%
     dplyr::arrange(!!rlang::enquo(grouping.var))%>%
     dplyr::group_by(!!rlang::enquo(grouping.var))%>%
     dplyr::mutate_at(dplyr::vars(!!!variables),
                function(x) zoo::na.locf(x[order(x)], na.rm = F))%>%
     dplyr::ungroup()
   return(data)
}
df <- tibble(record_id = c('A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'),
             x = c(NA, 1, NA, 2, NA, NA, NA, 3),
             y = c(1, NA, NA, NA, 2, 3, NA, NA))
df
df.2 <- mash(df, c('x','y'), grouping.var = record_id) #This works fine.
df.2

如果我不小心引用了 grouping.var,它將返回錯誤的數據而不會出錯。

df.3 <- mash(df, c('x','y'), grouping.var = 'record_id') #does not work

如果我沒有發現錯誤,這可能會給我帶來很大的麻煩。 所以我想添加一個檢查來確定傳遞給該參數的名稱是否格式正確。

我試過if(is.character(grouping.var))if(is_quosure(grouping.var))if(is.object(grouping.var))語句,但如果 grouping.var 沒有被引用(即格式正確),它將返回錯誤。 如果名稱在引號中,我需要一些可以停止 function 的東西,但如果它不在引號中,則允許它繼續。

我承認,quosures 通常讓我很困惑,所以我可以在這個問題上使用一些幫助。 也歡迎其他主要問題的解決方案。

您可以使用.data[[foo]] function,首先 enquo 變量。 使用 dplyr 進行編程

mash <- function(data, variables, grouping.var){

grouping.var = enquo(grouping.var)

 data %>%
  dplyr::arrange(.data[[grouping.var]]) %>%
  dplyr::group_by(.data[[grouping.var]]) %>%
  dplyr::mutate_at(dplyr::vars(!!!variables),
                 function(x) zoo::na.locf(x[order(x)], na.rm = F))%>%
  dplyr::ungroup()

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM