【发布时间】:2021-04-02 14:38:29
【问题描述】:
处理自定义函数时出现错误。“错误:Quosures 只能在 quasiquotation 上下文中不被引用。”很多类似的问答,但我在技术上还不足以解释。我所能辨别的是,这是我通过自定义函数调用 time_sec[event=='A'] 的尝试。违规行在下面的代码中注明。
library(dplyr)
# the data
set.seed(123)
event_df <- tibble(time_sec = c(1:120)) %>%
sample_n(100) %>%
mutate(period = sample(c(1,2,3),
size = 100,
replace = TRUE),
event = sample(c("A","B"),
size = 100,
replace = TRUE,
prob = c(0.1,0.9))) %>%
select(period, time_sec, event) %>%
arrange(period, time_sec)
# the function
filter_within_timeframe <- function(.data, condition, time, lead_time = 0, lag_time = 0){
condition <- enquo(condition)
time <- enquo(time)
filtered_lead <- c()
filtered_lag <- c()
if(lead_time > 0){
# filter lead events
filtered_lead <- .data %>%
slice(., 1:max(which(!!condition))) %>%
group_by(., grp = lag(cumsum(!!condition), default = 0)) %>%
filter(.,(last(!!time) - !!time) <= lead_time & (last(!!time) - !!time) >= 0) %>%
select(-grp)
}
if(lag_time > 0){
#filter lag events
filtered_lag <- .data %>%
slice(min(which(!!condition)):nrow(.)) %>% # remove rows before first occurance
group_by(grp = lead(rev(cumsum(rev(!!condition))), default = 0), period) %>%
filter((!!time - first(!!time[!!condition])) <= lag_time) # something in here doesn't work !!!!!!!!!!!!!
}
filtered <- rbind(filtered_lead, filtered_lag)
return(filtered)
}
利用lead_time 的调用按预期工作......
event_df %>% filter_within_timeframe(event == 'A', time_sec, 10, 0)
...但是对 lag_time 的调用会引发错误..
event_df %>% filter_within_timeframe(event == 'A', time_sec, 0, 10)
【问题讨论】:
标签: r