我希望使用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命令中选择特定的行和单元格,而不会在此过程中创建新对象。
答案 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
用于查找和评估内联代码的解析规则很复杂,因此在这里认为代码以`[`
结尾。因此,您可以将magrittr
和extract
和extract2
的别名用于内联代码:
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")