Несколько параметров с функцией рендеринга для цикла for в R - PullRequest
0 голосов
/ 26 июня 2019

Я хочу создать несколько .html с R, используя цикл for, включающий функцию rmarkdown :: render и содержащий несколько параметров (параметров) с условиями.Как я могу установить несколько параметров в этом случае?

Я пробовал следующий код, который не работает.

Пример шаблона Rmd:

---
title: "The ranking of `r params$word` companies"
output: distill::distill_article
params:
  country: "USA"
  word: "American"
  pays: "the United States"
---

Figure 1. Number of businesses in `r params$pays`      

```{r}
dataGraph1 <- filter(dataGraph7, country==params$country)
plot(dataGraph1)
```
It is interesting to observe the progress of those `r params$word` businesses.

Цикл for, созданный для получения HTML-кода из шаблона Rmd с различными параметрами:

# Directory containing input (and output) files
directory <- "~/thelink"

for (country in c("Canada", "USA", "France", "Germany", "UK", "Japan")) {
  if (country == "Canada"){
    word <- "Canadian"
    pays <- "Canada"
  } else if (country == "USA"){
    word <- "American"
    pays <- "the United States"
  } else if (country == "Germany") {
    word <- "German"
    pays <- "Germany"
  } else if (country == "France") {
    word <- "French"
    pays <- "France"
  } else if (country == "UK") {
    word <- "British"
    pays <- "The United Kingdom"
  } else (country == "Japan") {
    word <- "Japanese"
    pays <- "Japan"
  }
  input <- paste0(directory, "/", "iri2015template", ".Rmd")
  output <- paste0(directory, "/","iri2015", country, ".html")
  try(rmarkdown::render(input, params = list(country = country, word = word, pays = pays), output_file = output))
}

Ошибка:

Error: unexpected '}' in "  }"
>   input <- paste0(directory, "/", "iri2015template", ".Rmd")
>   output <- paste0(directory, "/","iri2015", country, ".html")
Error in paste0(directory, "/", "iri2015", country, ".html") : 
  object 'country' not found
>   try(rmarkdown::render(input, params = list(country = country, word = word, pays = pays), output_file = output))
Error in rmarkdown::render(input, params = list(country = country, word = word,  : 
  object 'output' not found
> }
Error: unexpected '}' in "}"
> 

Я хочу, чтобы цикл for создавал HTML-файл с именем iri2015USA.html, когда страна == США с другими параметрамикак слово == американец и платит == Соединенные Штаты.

Он должен создать HTML-файл с именем iri2015Canada.html, когда страна == Канада, а другие параметры в виде слова == канадский и платит == Канада.

и т. Д.

Большое спасибо.

Ответы [ 3 ]

0 голосов
/ 26 июня 2019
countries <-  c("Germany",
                "France",
                "UK",
                "USA",
                "Japan",
                "Canada")

for (country in countries) {
  nationality <- switch (country,
                         "USA" = "American",
                         "France" = "French",
                         "Germany" = "German",
                         "UK" = "British",
                         "Japan" = "Japanese",
                         "Canada" = "Canadian")
  name <- switch (country,
                  "USA" = "the United States",
                  "France" = "France",
                  "Germany" = "Germany",
                  "UK" = "the United Kingdom",
                  "Japan" = "Japan",
                  "Canada" = "Canadian")
  input <- paste0(directory, "/", "iri2015template", ".Rmd")
  output <- paste0(directory, "/","iri2015", country, ".html")
  rmarkdown::render(input, params = list(country = country, nationality = nationality, name = name), output_file = output)
}
0 голосов
/ 26 июня 2019

Рассмотрим даже Map (оболочку для mapply), которая представляет собой поэлементный цикл по векторам одинаковой длины (т. Е. Столбцам фрейма данных), который масштабируется до данных без корректировки кода switch или if.

country_df <- data.frame(
     country = c("Germany", "France", "UK", "USA", "Japan", "Canada"),
     nationality = c("German", "French", "British", "American", "Japanese", "Canadian"),
     names = c("Germany", "France", "the United Kingdom", 
               "the United States", "Japan", "Canada")
)

# USER-DEFINED FUNCTION OF MULTIPLE ARGS
html_build <- function(country, nationality, names) {    
  input <- paste0(directory, "/", "iri2015template", ".Rmd")
  output <- paste0(directory, "/","iri2015", country, ".html")

  rmarkdown::render(input, 
                    params = list(country = country, 
                                  nationality = nationality, 
                                  name = names), 
                    output_file = output)
}

# ELEMENT WISE (LOOP-HIDING) CALL
Map(html_build, country_df$country, country_df$nationality, country_df$names)

# with(country_df, Map(html_build, country, nationality, names))           # LESS WORDY
0 голосов
/ 26 июня 2019

Рассмотрим switch, используемый аналогично другим языкам (Java, C #, C ++, PHP, Perl):

for (country in c("Canada", "USA", "France", "Germany", "UK", "Japan")) {
  switch (country,           
          "Canada" = {
             word <- "Canadian"
             pays <- "Canada"
          },    
          "USA" = {
             word <- "American"
             pays <- "the United States"
          }, 
          "Germany" = {
             word <- "German"
             pays <- "Germany"
          }, 
           "France" = {
             word <- "French"
             pays <- "France"
          },
          "UK" = {
             word <- "British"
             pays <- "The United Kingdom"
          },
          "Japan" = {
             word <- "Japanese"
             pays <- "Japan"
          })

  input <- paste0(directory, "/", "iri2015template", ".Rmd")
  output <- paste0(directory, "/","iri2015", country, ".html")

  tryCatch(rmarkdown::render(input, 
                             params = list(country = country, word = word, pays = pays), 
                             output_file = output)
           , error = function(e) print(e)
  )              
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...