从R markdown内联代码中的tibble提取值

时间:2018-06-22 20:37:10

标签: r dplyr r-markdown knitr tibble

我希望使用R Markdown文档中的内联代码从小标题中访问一个值。

下面的代码给我一个1 x 2的小滴。

#library(tidyverse)
#library(knitr)

# Minimal working example
df <- tibble(
  Event = c("Swimming","Swimming","Swimming","Camping","Hiking","Hiking")
)
df

# Creates 1 row x 2 column
df %>% count(Event) %>% slice(which.max(n))

如果我在代码块中创建对象,则可以选择[1,1]并内联报告:

temp <- df %>% count(Event) %>% slice(which.max(n))

# The most popular event was `r temp[1,1]`.

# which becomes "The most popular event was Swimming."

是否可以在dplyr管道中执行此操作而不创建新对象?理想情况下,我可以通过内联代码完成所有操作,例如:

`r df %>% count(Event) %>% slice(which.max(n)) %>% df[1,1]`  # fails

退一步,我正在寻找一种可通用的技术,用于从一系列dplyr命令中选择特定的行和单元格,而不会在此过程中创建新对象。

3 个答案:

答案 0 :(得分:2)

即使不在R Markdown中,您要内联显示的代码行也不会运行,请在控制台中尝试。当在管道上使用[[[$之类的特殊运算符时,您需要在前缀中指定它们,而不是像其他函数一样以前缀形式指定它们。请注意您尝试的代码的比较,或者使用[[向下钻取并仅选择文本,而不返回小标题。

library(tidyverse)
df <- tibble(
  Event = c("Swimming","Swimming","Swimming","Camping","Hiking","Hiking")
)

df %>% count(Event) %>% slice(which.max(n)) %>% `[`(1,1)
#> # A tibble: 1 x 1
#>   Event   
#>   <chr>   
#> 1 Swimming
df %>% count(Event) %>% slice(which.max(n)) %>% `[[`("Event")
#> [1] "Swimming"

但是,这不能完全解决您的问题,因为R Markdown使用反引号表示内联代码,并且更改knitr用于查找和评估内联代码的解析规则很复杂,因此在这里认为代码以`[`结尾。因此,您可以将magrittrextractextract2的别名用于内联代码:

Most popular event was `r df %>% count(Event) %>% slice(which.max(n)) %>% magrittr::extract2("Event")`

可以正确地在渲染的Markdown中打印Most popular event was Swimming

答案 1 :(得分:0)

这是你的追求吗?

df %>% count(Event)

# A tibble: 3 x 2
#  Event        n
# 1 Camping      1
# 2 Hiking       2
# 3 Swimming     3

# To get the first row
(df %>% count(Event))[1,]

# Event       n
# 1 Camping   1

答案 2 :(得分:0)

我正在学习几种方法来完成此操作-谢谢!

1。。@labatnok之后:

r df %>% count(Event) %>% slice(which.max(n)) %>% {.[1,1]}

2。。@ mmyoung77之后:

`r df %>% count(Event) %>% arrange(desc(n)) %>% slice(1) %$% Event`

# result
[1] "Swimming"

此方法避免使用“ which.max”。 slice(1)中的“ 1”表示行,然后%$% Event表示列(按名称)。

要跟踪基础R的[1,1]发生的事情并不容易,但是可以完成工作。

3。。关注@Mo Alfaifi:

(df %>% count(Event) %>% arrange(desc(n)))[1,1]

这种方法使您更容易辨别正在选择的行/列。它还避免了需要为列命名。

4。。关注@Colum您:

df %>% count(Event) %>% slice(which.max(n)) %>% magrittr::extract2("Event")