1

长话短说:我有一个函数可以让参数grouping.var = record_id起作用,但grouping.var = "record_id"会返回不正确的数据而没有错误。所以我希望我的函数检查传递给参数的名称是否不在引号中。

长话短说:我经常有数据,每个研究对象都会有多次访问,每次访问对应一行。一些在访问之间不会改变的数据(例如种族或性别)只出现在一行上。我的函数会将数据从我提供的变量复制到该主题的所有行。

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 没有被引用(即格式正确),它将返回一个错误。如果名称在引号中,我需要一些可以停止该功能的东西,但如果它不在引号中,则允许它继续。

我承认,quosures 通常让我很困惑,所以我可以在这个问题上使用一些帮助。也欢迎其他主要问题的解决方案。

4

1 回答 1

2

您可以使用.data[[foo]]函数,首先 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()

}
于 2021-03-15T23:59:28.987 回答