मैं एक प्रक्रिया को स्वचालित करने और कई छोटे आंतरिक कार्यों को चलाने के लिए एक बाहरी फ़ंक्शन बनाने की कोशिश कर रहा हूं लेकिन function जिसमें variable names हैं क्योंकि तर्क त्रुटियां पैदा कर रहे हैं:

जब मैं नीचे दिए गए फ़ंक्शन को अपने आप चलाता हूं तो यह ठीक काम करता है:

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

################ fn_benchmark_country ################

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) %>% 
                                  
                                  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)
  
  return(gapminder_joined)  
}

################ ----------------------------- ################

# Calling function
fn_benchmark_country(Vietnam) 

country     year     pop  continent  lifeExp    gdpPercap   benchmarked

Afghanistan 1952    8425333 Asia    28.80100    779.4453    232.879565
Afghanistan 1957    9240934 Asia    30.33200    820.8530    230.791034

लेकिन जब मैं इसे बाहरी फ़ंक्शन के अंदर चलाता हूं तो यह मुझे त्रुटि देता है:

fn_run_all <-function(bench_country = India, year_start = 1952, year_end = 2007){
  
  bench_country = bench_country
  year_start = year_start
  year_end = year_end
  
  fn_benchmark_country(bench_country)
}

fn_run_all()

Error in fn_run_all() : object 'India' not found

अगर मैं तर्क में enquo जोड़ता हूं तो मुझे अभी भी त्रुटि मिलती है जैसा कि नीचे दिखाया गया है"

fn_run_all <-function(bench_country = India, year_start = 1952, year_end = 2007){
  
  bench_country = enquo(bench_country)
  year_start = year_start
  year_end = year_end
  
  fn_benchmark_country(bench_country)
}

fn_run_all()

Error: Problem with `mutate()` input `..1`. x Base operators are not defined for quosures. Do you need to unquote the quosure? # Bad: lhs - myquosure # Good: lhs - !!myquosure i Input `..1` is `across(-1, ~. - bench_country)`.

सुनिश्चित नहीं है कि इसे कैसे हल किया जाए, किसी भी मदद की सराहना करेंगे !!

यहां से नया प्रासंगिक मुद्दा जोड़ना

अब अंतिम आंतरिक फ़ंक्शन कॉल fn_create_plot() के कारण त्रुटि हो रही है

प्लॉट के creating dynamic subtitle में bench_country के उपयोग के कारण यह उसी प्रकार की समस्या है, लेकिन इस बार मैंने {{}} का उपयोग किया है लेकिन फिर भी समस्या हो रही है

fn_run_all <-function(bench_country = India, year_start = 1952, year_end = 2007){
  

  year_start = year_start
  year_end = year_end
  
  fn_benchmark_country({{bench_country}})
  
  fn_year_filter(gapminder_joined, year_start, year_end) %>% 
  
  fn_create_plot(., year_start, year_end, {{bench_country}})
}

fn_run_all(Vietnam, 1967, 2002)

Error in sprintf("Benchmarked %i in blue line \nFor Countries with pop > 30000000 \n(Chart created by ViSa)", : object 'Vietnam' not found

संदर्भ के लिए फ़ंक्शन कोड

################ fn_create_plot ################
  
fn_create_plot <- function(df, year_start, year_end, bench_country ){

                  
                  
                  # plotting
                      ggplot(df) +
                        
                      geom_vline(xintercept = 0, col = "blue", alpha = 0.5) +
    
                      geom_label( label="India - As Benchamrking line", x=0, y="United States",
                        label.padding = unit(0.55, "lines"), # Rectangle size around label
                        label.size = 0.35, color = "black") +
                      
                      geom_segment(aes(x = benchmarked_start, xend = benchmarked_end,
                                       y = country, yend = country,
                                       col = continent), alpha = 0.5, size = 7) +
                      
                      geom_point(aes(x = benchmarked, y = country, col = continent), size = 9, alpha = .6) +
                      
                      geom_text(aes(x = benchmarked_start + 8, y = country,
                                    label = paste(country, round(benchmarked_start))),
                                col = "grey50", hjust = "right") +
                      
                      geom_text(aes(x = benchmarked_end - 4.0, y = country,
                                    label = round(benchmarked_end)),
                                col = "grey50", hjust = "left") +
                    
                      
                      # scale_x_continuous(limits = c(20,85)) +
                      
                      scale_color_brewer(palette = "Pastel2") +
                      
                      labs(title = sprintf("GdpPerCapita Differenece with India (Starting point at %i and Ending at %i)",year_start, year_end),
                           subtitle = sprintf("Benchmarked %i in blue line \nFor Countries with pop > 30000000 \n(Chart created by ViSa)", bench_country),
                           col = "Continent", x = sprintf("GdpPerCap Difference at %i & %i", year_start, year_end) ) +
                      
                  # background & theme settings
                      theme_classic() +
                      
                      theme(legend.position = "top", 
                            axis.line = element_blank(),
                            axis.ticks = element_blank(),
                            axis.text = element_blank()
                            )
}

################ ----------------------------- ################
0
ViSa 27 सितंबर 2020, 17:35

1 उत्तर

सबसे बढ़िया उत्तर

जब आप enquo() का उपयोग करते हैं तो आपको !! का उपयोग करने की भी आवश्यकता होती है जब आप फ़ंक्शन के भीतर वेरिएबल को प्रश्न में कहते हैं। यह सही है:

fn_run_all <-function(bench_country = India, year_start = 1952, year_end = 2007){
  
  bench_country = enquo(bench_country)
  year_start = year_start
  year_end = year_end
  
  fn_benchmark_country(!! bench_country)
}

fn_run_all()

आप बस enquo() और !! को सुरंग {{ }} से भी बदल सकते हैं:

fn_run_all <-function(bench_country = India, year_start = 1952, year_end = 2007){
  
  year_start = year_start
  year_end = year_end
  
  fn_benchmark_country({{ bench_country }})
}

fn_run_all()
1
Phil 27 सितंबर 2020, 18:30