flextable в Rmarkdown docx не печатает внутри оператора if, если другой текст - PullRequest
11 голосов
/ 31 мая 2019

Я пытаюсь использовать пакет flextable, чтобы получить несколько хорошо отформатированных таблиц в моем Rmarkdown (переход к файлу word).Таблицы в целом работают нормально, но если я помещу это в оператор if, если из оператора if будет напечатано что-то еще, я не вижу таблицу.Любые идеи, что происходит?

Мой пример (запустить все вместе):

---
title: "Testing"
output: 
  word_document:
    reference_docx: styles.docx
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

## R Markdown

```{r defaults}
library(pander)
library(knitr)
library(flextable)

```

1-й тест работает нормально - нет, если оператор и новые строки по обе стороны таблицы

## test 1 table no if statemnets

```{r test1, echo = FALSE, results = 'asis'}

  test <- data.frame (c = 1:5, x = 6:10)

  testft <- flextable(test)
  testft

```

2-й тест имеет оператор if без другого текста и отлично работает

## test 2 if statement no other text

```{r test2, echo = FALSE, results = 'asis'}
RunTable <- TRUE
if(RunTable){

  testft

}

```

Но если я попытаюсь добавить другие выходные данные в свой оператор if, с или без новых разрывов строк, я не получулюбая таблица в моем выводе

## test 3 if statement with other text


```{r test3, echo = FALSE, results = 'asis'}
#Hack so dat works up to year 2047 as cpp functions in padr can't handle data beyond 2038 
#Get Daily Values
RunTable <- TRUE
if(RunTable){

    print("before   ")

  testft

    print("after   ")

}

```

## test 4 if statement with other text and newlines


```{r test4, echo = FALSE, results = 'asis'}
RunTable <- TRUE
if(RunTable){

  print("if with linebreak before   ")
  cat("  \n")

  knit_print(testft)

  cat("  \n")

  print("if with linebreak after   ")


}

```

Вывод: My output

Ответы [ 3 ]

3 голосов
/ 03 июня 2019

Вы можете использовать параметр чанка results = 'asis' и записать содержимое openxml с помощью format следующим образом

## test 4 if statement with other text and newlines


```{r test4, echo = FALSE, results = 'asis'}
RunTable <- TRUE
if(RunTable){

  print("if with linebreak before   ")
  cat("  \n")

    cat(
      paste(
        "\n```{=openxml}", 
        format(testft, type = "docx"), 
        "```\n", sep = "\n")
    )

  cat("  \n")

  print("if with linebreak after   ")
}

```
2 голосов
/ 03 июня 2019

Не уверен, если вы рассмотрите другой пакет, но это, кажется, работает:

---
title: "Testing"
output: 
  word_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, fig.height=1.5, fig.width=3, fig.align='right', fig.align = "center")
```

## R Markdown

```{r defaults}
library(pander)
library(knitr)
library(flextable)
library(tableHTML)

```


## test 1 table no if statemnets

```{r test1, echo = FALSE}

  test <- data.frame (c = 1:5, x = 6:10)
  tab <- tableHTML(test, widths = c(60, 60), rownames = FALSE) %>% add_theme('scientific')

  tab %>% tableHTML_to_image()

```

## test 2 if statement no other text

```{r test2, echo = FALSE}
RunTable <- TRUE
if(RunTable){

  tab %>% tableHTML_to_image()

}

```


```{r test3, echo = FALSE}
#Hack so dat works up to year 2047 as cpp functions in padr can't handle data beyond 2038 
#Get Daily Values
RunTable <- TRUE
if(RunTable){

  print("before   ")

  tab %>% tableHTML_to_image()

  print("after   ")

}

```

## test 4 if statement with other text and newlines


```{r test4, echo = FALSE}
RunTable <- TRUE
if(RunTable){

  print("if with linebreak before   ")
  cat("  \n")

  tab %>% tableHTML_to_image()

  cat("  \n")

  print("if with linebreak after   ")


}

Например, вы можете увидеть тест 4 как вывод:

enter image description here

Пара заметок:

  • Вы можете отформатировать таблицу точно так, как вы хотите.
  • Код создает изображение.
2 голосов
/ 02 июня 2019

Я предполагаю, что ваша проблема связана с этой проблемой .Изменение проблемных блоков, как это, похоже, работает:

## test 3 if statement with other text

```{r test3, echo = FALSE}
RunTable <- TRUE
if(RunTable){
  text <- c(
    "before   ",
    knit_print(testft),
    "after   "
  )

  asis_output(paste(text, collapse = "\n"))
}
```

## test 4 if statement with other text and newlines

```{r test4, echo = FALSE}
RunTable <- TRUE
if(RunTable){
  text <- c(
    "if with linebreak before   ",
    "  \\newline",
    knit_print(testft),
    "  \\newline\n",
    "if with linebreak after   "
  )

  asis_output(paste(text, collapse = "\n"))
}
```

По поводу последнего:

  • Мне пришлось использовать \\newline, чтобы фактически вставить дополнительную пустую строку перед таблицей.
  • Я не знаю, почему после пустой строки требуется дополнительный \n, иначе у меня это не сработает.
  • Просто чтобы проверить, я попытался добавить несколько \\newline записей, как до, так и после, но больше всего я мог получить одну пустую строку.
...