嵌套函数中的Quosure
我正在努力编写一个使用fun1的函数fun2。。。不断地出错。我在下面写了一个简化的例子。这是我第一次处理“整洁的评估”,不确定是否理解它的来龙去脉 数据帧示例:嵌套函数中的Quosure,r,dplyr,quosure,R,Dplyr,Quosure,我正在努力编写一个使用fun1的函数fun2。。。不断地出错。我在下面写了一个简化的例子。这是我第一次处理“整洁的评估”,不确定是否理解它的来龙去脉 数据帧示例: d1 = data.frame( ID = c("A", "A", "A", "B", "B", "C", "C", "C", "C"), EXPR = c(2, 8, 3, 5, 7, 20, 1, 5, 4) ) d2 = data.frame( ID = c("A", "B", "C"), NUM = c(22
d1 = data.frame(
ID = c("A", "A", "A", "B", "B", "C", "C", "C", "C"),
EXPR = c(2, 8, 3, 5, 7, 20, 1, 5, 4)
)
d2 = data.frame(
ID = c("A", "B", "C"),
NUM = c(22, 50, 31)
)
第一个功能
fun1 <- function(
df1 = "df 1",
df2 = "df 2",
t1 = "threshold 1",
expr_col = "expr column",
id_col = "sample column - must be present in df1 and df2") {
# dataframes
df <- df1
db <- df2
# quosure
enquo_id <- enquo(id_col)
enquo_expr <- enquo(expr_col)
# classify
df <- df %>%
mutate(threshold = t1) %>%
mutate(class = ifelse(!!enquo_expr > t1, "positive", "negative")) %>%
mutate(class = factor(class, levels = c("positive", "negative")))
# calculate sample data
df.sum <- df %>%
group_by(!!enquo_id, class) %>%
summarise(count = n()) %>%
complete(class, fill = list(count = 0)) %>%
mutate(total = sum(count), freq = count/total)
# merge dataframes
df.sum <- left_join(df.sum, db, by = quo_name(enquo_id))
# return
return(df.sum)
}
我试过各种各样的东西。。。我被困在这里了。我想我没有正确使用enquo()。我可以通过不使用varX并直接在fun1参数中输入每个元素的实际适当名称来实现它,但对我来说,这样做的全部目的是使它“通用化”因此,仅在fun2中指定参数,然后将这些参数传递给fun1
任何帮助都将不胜感激 非常感谢您的回答。我现在使用以下代码进行排序:
fun2 <- function(
df1 = "df 1",
df2 = "df 2",
expr_col = "expr column",
id_col = "sample column - must be present in df1 and df2",
ti = "initial value",
tf = "final value",
res = "resolution") {
# define variables for fun1
var4 <- enquo(expr_col)
var5 <- enquo(id_col)
# get sequence of values
seq <- seq(from = ti, to = tf, by = res)
# open list
t.list <- list()
### Loop --------------------------------------------------------------
for (i in seq_along(seq)){
t1 <- seq[i]
t.list[[i]] <- fun1(df1 = df1,
df2 = df2,
t1 = t1,
expr_col = !!var4,
id_col = !!var5)
}
df.out <- plyr::ldply(t.list, rbind)
### Return ---
return(df.out)
}
# TEST FUN2
test <- fun2(df1 = d1, df2 = d2, expr_col = EXPR, id_col = ID, ti = 1, tf = 10, res = 1)
fun2传递EXPR
并期望它工作意味着EXPR
可以在全局环境中找到(根据您提供的代码判断,它不是)。也许您想引用一个名为EXPR
的数据帧列?或者您可能想attach()
dataframe?EXPR
这是dataframed1
的列名。。。但事实上,我的代码似乎不起作用……当您将EXPR
传递到fun2()
时,您将其作为对象EXPR
传递,而不是数据帧列。是否您的意思是d1$EXPR
?在fun2()
中没有使用参数名称。例如,您的参数名是expr\u col
,但您使用expr
。id\u col
vsid
也有同样的问题。我认为您需要,例如,var4
fun2 <- function(
df1 = "df 1",
df2 = "df 2",
expr_col = "expr column",
id_col = "sample column - must be present in df1 and df2",
ti = "initial value",
tf = "final value",
res = "resolution") {
# define variables for fun1
var1 <- enquo(d1)
var2 <- enquo(d2)
var3 <- enquo(t1)
var4 <- enquo(EXPR)
var5 <- enquo(ID)
# get sequence of values
seq <- seq(from = ti, to = tf, by = res)
# open list
t.list <- list()
# Loop ----
for (i in seq_along(seq)){
t1 <- seq[i]
t.list[[i]] <- fun1(df1 = var1,
df2 = var2,
t1 = var3,
expr_col = var4,
id_col = var5)
}
df.out <- plyr::ldply(t.list, rbind)
### Return ---
return(df.out)
}
test <- fun2(df1 = d1, df2 = d2, expr_col = EXPR, id_col = ID, ti = 1, tf = 10, res = 1)
Error in (function (x) : object 'EXPR' not found
fun2 <- function(
df1 = "df 1",
df2 = "df 2",
expr_col = "expr column",
id_col = "sample column - must be present in df1 and df2",
ti = "initial value",
tf = "final value",
res = "resolution") {
# define variables for fun1
var4 <- enquo(expr_col)
var5 <- enquo(id_col)
# get sequence of values
seq <- seq(from = ti, to = tf, by = res)
# open list
t.list <- list()
### Loop --------------------------------------------------------------
for (i in seq_along(seq)){
t1 <- seq[i]
t.list[[i]] <- fun1(df1 = df1,
df2 = df2,
t1 = t1,
expr_col = !!var4,
id_col = !!var5)
}
df.out <- plyr::ldply(t.list, rbind)
### Return ---
return(df.out)
}
# TEST FUN2
test <- fun2(df1 = d1, df2 = d2, expr_col = EXPR, id_col = ID, ti = 1, tf = 10, res = 1)