#r #function #types #reference #assign
#r #функция #типы #ссылка #назначить
Вопрос:
Я пишу функцию, которая помогает мне подмножествовать фрейм данных, а затем передает фрейм данных в другое действие. Выводом для этой функции будет результат для второго действия. Однако, поскольку мне все равно понадобится очищенный фрейм данных для другой цели, мне было интересно, могу ли я сохранить такой фрейм данных в среде, чтобы его можно было вызвать позже?
Например, допустим, у меня есть этот фрейм данных.
ID Var1
1 5 3
2 6 1
И моя функция выглядит так:
mu_fuc <- function(df, condition) {
#clean dataset
condition <- eval(as.list(match.call())$condition, df)
workingdf <- subset(df, condition < 3). ####I am trying to store this working dataframe for later use.
#second action
result = sum(workingdf[condition])
#output of the function
return(result)
}
Поскольку результат функции будет использоваться и позже, я не могу добавить workingdf для возврата. В противном случае вывод функции будет содержать workingdf, когда я попытаюсь передать вывод другой функции, чего я не хочу.
Так, например, в этом случае, если я хочу сделать, мне нужно, чтобы вывод функции состоял только из целых чисел.
my_fun(data, Var1) - 5
Надеюсь, я ясно выражаюсь.
Любая помощь приветствуется!!
Ответ №1:
Вы можете вернуть список из функции с желаемым результатом.
mu_fuc <- function(df, condition) {
#clean dataset
condition <- eval(as.list(match.call())$condition, df)
workingdf <- subset(df, condition < 3)
#second action
result = sum(workingdf)
#output of the function
return(list(result = result, workingdf = workingdf))
}
Вызовите его как :
output <- mu_fuc(df, Var1)
Вы можете отделить результат с помощью $
operator и обработать их отдельно.
output$result
output$workingdf
Ответ №2:
Вы можете сохранить workingdf
в attr
ibute.
mu_fuc <- function(df, condition) {
## clean dataset
condition <- eval(as.list(match.call())$condition, df)
workingdf <- subset(df, condition < 3)
## second action
result <- sum(condition)
attr(result, "workingdf") <- workingdf
return(result)
}
Вычисление с результатом как обычно.
r <- mu_fuc(d, Var1)
r - 5
# [1] -1
# attr(,"workingdf")
# ID Var1
# 2 6 1
Чтобы избежать отображения атрибута по косметическим причинам, используйте as.numeric
as.numeric(r) - 5
# [1] -1
или
r2 <- as.numeric(mu_fuc(d, Var1))
r2 - 5
# [1] -1
Чтобы получить workingdf
, извлеките его из атрибута.
wdf <- attr(mu_fuc(d, Var1), "workingdf")
wdf
# ID Var1
# 2 6 1
Данные:
d <- data.frame(ID=5:6, Var1=c(3, 1))