Я создал внешнюю функцию для запуска трех внутренних функций для предварительной обработки данных, а затем построил и сохранил их.
Проблемы при совместном использовании вывода фрейма данных одной внутренней функции со следующей внутренней функцией
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()
}
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
#...
#...
}
Похожие вопросы
Новые вопросы
r
R — это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, используйте минимально воспроизводимые примеры, которые другие могут запустить с помощью копирования и вставки. Показать желаемый результат полностью. Используйте dput() для данных и укажите все небазовые пакеты с помощью library(). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. Для вопросов по статистике используйте https://stats.stackexchange.com.