R:在使用 dplyr 的函数中,如何检查以确保在继续之前未引用参数名称?
R: In a function using dplyr, how do I check to make sure that an argument name is not quoted before proceeding?
长话短说: 我有一个函数,参数 grouping.var = record_id
可以工作,但是 grouping.var = "record_id"
会 return 不正确的数据没有错误。所以我希望我的函数检查传递给参数的名称是否不在引号中。
长话短说: 我经常有这样的数据,每个研究对象都会有多次访问,每次访问对应一行。一些在访问之间不会改变的数据(例如种族或性别)只出现在一行中。我的函数会将我输入的变量中的数据复制到该主题的所有行。
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,它会return错误的数据而不会出错。
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 没有被引用(即格式正确),它将 return一个错误。如果名称在引号中,我需要一些东西来停止该功能,但如果它不在引号中则允许它继续。
我承认 quosures 通常让我感到困惑,所以我可以在这方面寻求一些帮助。也欢迎针对主要问题的其他解决方案。
可以使用.data[[foo]]
函数,先enquo变量。 Programming with 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()
}
长话短说: 我有一个函数,参数 grouping.var = record_id
可以工作,但是 grouping.var = "record_id"
会 return 不正确的数据没有错误。所以我希望我的函数检查传递给参数的名称是否不在引号中。
长话短说: 我经常有这样的数据,每个研究对象都会有多次访问,每次访问对应一行。一些在访问之间不会改变的数据(例如种族或性别)只出现在一行中。我的函数会将我输入的变量中的数据复制到该主题的所有行。
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,它会return错误的数据而不会出错。
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 没有被引用(即格式正确),它将 return一个错误。如果名称在引号中,我需要一些东西来停止该功能,但如果它不在引号中则允许它继续。
我承认 quosures 通常让我感到困惑,所以我可以在这方面寻求一些帮助。也欢迎针对主要问题的其他解决方案。
可以使用.data[[foo]]
函数,先enquo变量。 Programming with 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()
}