Я изо всех сил пытаюсь написать функцию fun2, которая использует fun1 ... и все время получаю ошибки. Ниже я написал упрощенный пример. Я впервые имею дело с «аккуратной оценкой» и не уверен, что понимаю ее все.
Примеры фреймов данных:
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)
}
Если я проведу тест, я получу взамен фрейм данных, как и ожидалось.
test <- fun1(df1 = d1, df2 = d2, t1 = 3, expr_col = EXPR, id_col = ID)
Вторая функция Теперь с помощью fun2 я пытаюсь использовать fun1 в цикле for для итерации от ti до tf вектора seq:
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
Я пробовал разные вещи ... и я как бы застрял здесь. Думаю, я неправильно использую enquo (). Я могу заставить его работать, не используя varX и напрямую помещая фактическое соответствующее имя каждого элемента в аргументы fun1, но весь смысл этого для меня, состоит в том, чтобы сделать его «универсальным» и, следовательно, указать аргументы только в fun2, которые затем будут переданы в fun1.
Любая помощь будет принята с благодарностью.
EXPR
и ожидание его работы означает, чтоEXPR
можно найти в глобальной среде (а это не так, судя по предоставленному вами коду). Возможно, вы имели в виду столбец фрейма данных с именемEXPR
? Или, может быть, вы имели в видуattach()
фрейм данных? - person 12b345b6b78   schedule 02.11.2018EXPR
вот имя столбца фрейма данных _2 _... но на самом деле мой код, похоже, не помогает ... - person r_mvl   schedule 02.11.2018EXPR
вfun2()
, вы передаете его как объектEXPR
, а не как столбец фрейма данных. Может быть, вы имели в видуd1$EXPR
? - person 12b345b6b78   schedule 02.11.2018fun2()
. Например, ваше имя аргументаexpr_col
, но вы используетеEXPR
. Та же проблема дляid_col
vsID
. Я думаю, вы хотите, например,var4 <- enquo(expr_col)
. Вам нужно будет отменить кавычки для всех имен переменных для использования в вашей функции вfun2()
(expr_col = !! var4)
. Ваши наборы данных и константы (аргументыdf1
,df2
иti
), вероятно, могут использоваться напрямую, напримерfun1(df1 = df1, df2 = df2, t1 = ti, expr_col = !! var4, id_col = !! var5)
(хотя я немного смущен вашим использованием oft1
vsti
в вашем цикле for). - person aosmith   schedule 02.11.2018