Я создал внешнюю функцию для запуска трех внутренних функций для предварительной обработки данных, а затем построил и сохранил их.

Проблемы при совместном использовании вывода фрейма данных одной внутренней функции со следующей внутренней функцией

library(tidyverse)
library(glue)

gapminder <- read.csv("https://raw.githubusercontent.com/swcarpentry/r-novice-gapminder/gh-pages/_episodes_rmd/data/gapminder-FiveYearData.csv")

Внешняя функция

fn_run_all <-function(bench_country = India, year_start = 1952, year_end = 2007){
  
  
  year_start = year_start
  year_end = year_end
  
  # Function1 for PreProcess Benchmarked Country
  fn_benchmark_country({{bench_country}}) 

  # Function2 to PreProcess dates & pass df to function3 to plot  
  Plot_final <- fn_year_filter(gapminder_joined, year_start, year_end) %>% 
  
                # function 3 to plot  
                fn_create_plot(., year_start, year_end, {{bench_country}})
  
  
  # Saving plot
  jpeg(file="gdp_benchmarked_FinalPlot.jpeg", width = 1400, height = 1800)
  Plot_final
  dev.off()
  
  # Printing Plot
  Plot_final
  }

fn_run_all(India, 1952, 2002)

Выпуск 1

Если я не делаю вывод фрейма данных, то есть gapminder_joined 1-й функции fn_benchmark_country() как global, то получаю ошибку в function2 fn_year_filter().

Но когда я нажимаю этот вывод function1, то есть gapminder_joined на Global, он работает.

Is it necessary to make it global even when I am returning it within the outer function or there is some other alternative way?

Справочный код функции 1

fn_benchmark_country  <- function(bench_country = India){
  
  bench_country = enquo(bench_country)

  gapminder_benchmarked_wider <- gapminder %>% 
                                  select(country, year, gdpPercap) %>% 
                                  pivot_wider(names_from = country, values_from = gdpPercap) %>% 
                                  arrange(year) %>% 
                                  # map_dbl( ~{.x - India })
                                  mutate(across(-1, ~ . - !!bench_country))
                                  
  # Reshaping back to Longer
  gapminder_benchmarked_longer <- gapminder_benchmarked_wider %>% 
                                  pivot_longer(cols = !year, names_to = "country", values_to = "benchmarked") 
 
  # Joining tables
  gapminder_joined <- left_join(x = gapminder, y = gapminder_benchmarked_longer, by = c("year","country"))

  # converting to factor
  gapminder_joined$country <- as.factor(gapminder_joined$country)
  
  # gapminder_joined <<- gapminder_joined
  return(gapminder_joined)
}

В приведенном выше коде, если я раскомментирую 2-ю последнюю строку, это сработает.

Справочный код функции 2

fn_year_filter  <- function(gapminder_joined, year_start, year_end){

                              gapminder_joined %>% 
                              filter(year %in% c(year_start,year_end)) %>% 
                              
                              arrange(country, year) %>% 
                              
                              group_by(country) %>% 
                              
                              mutate(benchmark_diff = benchmarked[2] - benchmarked[1],
                                     max_pop = max(pop)) %>% 
                              
                              ungroup() %>% 
                              
                              arrange(benchmark_diff) %>% 
                              
                              filter(max_pop > 30000000) %>% 
                              
                              mutate(country = droplevels(country)) %>% 
                              select(country, year, continent, benchmarked, benchmark_diff) %>% 
                                
                              # --- 
                              mutate(country = fct_inorder(country)) %>% 
                              
                              group_by(country) %>% 
                                
                              mutate(benchmarked_end = benchmarked[2],
                                     benchmarked_start = benchmarked[1]  ) %>% 
                              
                              ungroup() 

  }
0
ViSa 28 Сен 2020 в 12:05

1 ответ

Лучший ответ

Не обновляйте переменные внутри функции. Выбранный вами подход правильный, поэтому нет необходимости использовать <<-, оставьте fn_benchmark_country как есть. Попробуйте сохранить возвращенный фрейм данных в функции.

fn_run_all <-function(bench_country = India, year_start = 1952, year_end = 2007){
  
  # Function1 for PreProcess Benchmarked Country
  gapminder_joined <- fn_benchmark_country({{bench_country}}) 
  # Function2 to PreProcess dates & pass df to function3 to plot  
  Plot_final <- fn_year_filter(gapminder_joined, year_start, year_end) %>% 
    # function 3 to plot  
   fn_create_plot(., year_start, year_end, {{bench_country}})
   #...rest of the code
   #...
   #...
  
}
0
Ronak Shah 28 Сен 2020 в 10:26