Сохраните объект для последующего использования при написании функции

#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))