使用knitr时如何配置代码?
我试图建立一个工作流程,使用使用knitr时如何配置代码?,r,profiling,knitr,evaluate,R,Profiling,Knitr,Evaluate,我试图建立一个工作流程,使用knitr和 render\u markdown(strict=T)设置我的答案和/或问题的格式 最近,我尝试使用profr对一些代码运行评测,由于knitr的实现,评测将拾取支持knitr的evaluate等的所有调用 比如说 不穿针织衫 如果我运行在纯R library(profr) quantile_ex <- profr({Sys.sleep(1); example(quantile, setRNG = TRUE)}, 0.01) quantile_ex
knitr
和
render\u markdown(strict=T)
设置我的答案和/或问题的格式
最近,我尝试使用profr
对一些代码运行评测,由于knitr
的实现,评测将拾取支持knitr
的evaluate
等的所有调用
比如说
不穿针织衫
如果我运行在纯R
library(profr)
quantile_ex <- profr({Sys.sleep(1); example(quantile, setRNG = TRUE)}, 0.01)
quantile_ex
## f level time start end leaf source
## 9 Sys.sleep 1 0.64 0.01 0.65 TRUE base
## 10 example 1 0.05 0.65 0.70 FALSE utils
## 11 index.search 2 0.01 0.65 0.66 FALSE <NA>
## 12 <Anonymous> 2 0.02 0.66 0.68 FALSE <NA>
## 13 source 2 0.01 0.68 0.69 FALSE base
## 14 unlink 2 0.01 0.69 0.70 TRUE base
## 15 file.exists 3 0.01 0.65 0.66 TRUE base
## 16 prepare_Rd 3 0.01 0.66 0.67 FALSE <NA>
## 17 of0 3 0.01 0.67 0.68 FALSE <NA>
## 18 file 3 0.01 0.68 0.69 TRUE base
## 19 .getHelpFile 4 0.01 0.66 0.67 FALSE <NA>
## 20 of1 4 0.01 0.67 0.68 FALSE <NA>
## 21 <Anonymous> 5 0.01 0.66 0.67 FALSE <NA>
## 22 WriteLines 5 0.01 0.67 0.68 FALSE <NA>
## 23 lazyLoadDBexec 6 0.01 0.66 0.67 FALSE base
## 24 writeLines 6 0.01 0.67 0.68 FALSE base
## 25 fun 7 0.01 0.66 0.67 FALSE <NA>
## 26 paste0 7 0.01 0.67 0.68 FALSE base
## 27 basename 8 0.01 0.66 0.67 TRUE base
## 28 wr 8 0.01 0.67 0.68 FALSE <NA>
## 29 paste0 9 0.01 0.67 0.68 FALSE base
## 30 strwrap 10 0.01 0.67 0.68 FALSE base
## 31 lapply 11 0.01 0.67 0.68 FALSE base
## 32 strsplit 12 0.01 0.67 0.68 TRUE base
它似乎没有实际分析运行的代码,只有knitr
/evaluate
详细信息
问题和可能的解决办法
我目前的工作流程是在knitr之外运行评测,但我发现自动格式化(用##
注释输出)非常有用
是否有人找到了一个简洁的解决方案,或者是软件包开发人员需要解决的问题
我目前的想法是重写parserprof
,将其自身限制在对force
的第一次调用之上(而不是默认级别7)
重写profr的示例
下面是对profr
的重写,几乎可以正常工作
库(profr)
profr类似于块的profrk设置怎么样
library(profr)
profrk <- function(expr, delay = 1, interval = 0.02, quiet) {
profrk_marker <- function(expr) {
eval(expr)
}
filter <- function(prof.out) {
level.filter <- prof.out$level[which(prof.out == "profrk_marker")] +
2
prof.out <- prof.out[prof.out$level > level.filter, ]
time.offset <- min(prof.out$start)
prof.out$start <- prof.out$start - time.offset
prof.out$end <- prof.out$end - time.offset
prof.out
}
filter(profr({
Sys.sleep(delay)
profrk_marker(substitute(expr))
}, interval = interval, quiet = quiet))
}
pr <- profrk(example(quantile, setRNG = TRUE), delay = 1, interval = 0.01, quiet = TRUE)
print(pr)
## f level time start end leaf source
## 39 example 31 0.08 0.00 0.08 FALSE utils
## 40 index.search 32 0.01 0.00 0.01 FALSE <NA>
## 41 <Anonymous> 32 0.05 0.01 0.06 FALSE <NA>
## 42 source 32 0.02 0.06 0.08 FALSE base
## 43 readRDS 33 0.01 0.00 0.01 FALSE base
## 44 prepare_Rd 33 0.02 0.01 0.03 FALSE <NA>
## 45 RdTags 33 0.01 0.03 0.04 FALSE <NA>
## 46 of0 33 0.01 0.04 0.05 FALSE <NA>
## 47 render 33 0.01 0.05 0.06 FALSE <NA>
## 48 srcfilecopy 33 0.01 0.06 0.07 FALSE base
## 49 withVisible 33 0.01 0.07 0.08 FALSE base
## 50 gzfile 34 0.01 0.00 0.01 TRUE base
## 51 .getHelpFile 34 0.02 0.01 0.03 FALSE <NA>
## 52 sapply 34 0.01 0.03 0.04 FALSE base
## 53 of1 34 0.01 0.04 0.05 FALSE <NA>
## 54 of0 34 0.01 0.05 0.06 FALSE <NA>
## 55 file.info 34 0.01 0.06 0.07 FALSE base
## 56 eval 34 0.01 0.07 0.08 FALSE base
## 57 <Anonymous> 35 0.02 0.01 0.03 FALSE <NA>
## 58 simplify2array 35 0.01 0.03 0.04 FALSE base
## 59 WriteLines 35 0.01 0.04 0.05 FALSE <NA>
## 60 of1 35 0.01 0.05 0.06 FALSE <NA>
## 61 .POSIXct 35 0.01 0.06 0.07 FALSE base
## 62 eval 35 0.01 0.07 0.08 FALSE base
## 63 lazyLoadDBexec 36 0.02 0.01 0.03 FALSE base
## 64 unique 36 0.01 0.03 0.04 TRUE base
## 65 writeLines 36 0.01 0.04 0.05 FALSE base
## 66 WriteLines 36 0.01 0.05 0.06 FALSE <NA>
## 67 structure 36 0.01 0.06 0.07 TRUE base
## 68 quantile 36 0.01 0.07 0.08 FALSE stats
## 69 readRDS 37 0.01 0.01 0.02 TRUE base
## 70 fun 37 0.01 0.02 0.03 FALSE <NA>
## 71 paste0 37 0.01 0.04 0.05 FALSE base
## 72 writeLines 37 0.01 0.05 0.06 FALSE base
## 73 quantile.default 37 0.01 0.07 0.08 FALSE stats
## 74 fetch 38 0.01 0.02 0.03 FALSE <NA>
## 75 wr 38 0.01 0.04 0.05 FALSE <NA>
## 76 paste0 38 0.01 0.05 0.06 FALSE base
## 77 paste 38 0.01 0.07 0.08 FALSE base
## 78 <Anonymous> 39 0.01 0.02 0.03 FALSE <NA>
## 79 paste0 39 0.01 0.04 0.05 FALSE base
## 80 remap 39 0.01 0.05 0.06 FALSE <NA>
## 81 formatC 39 0.01 0.07 0.08 FALSE base
## 82 getFromFrame 40 0.01 0.02 0.03 TRUE <NA>
## 83 strwrap 40 0.01 0.04 0.05 FALSE base
## 84 psub 40 0.01 0.05 0.06 TRUE <NA>
## 85 blank.chars 40 0.01 0.07 0.08 FALSE <NA>
## 86 lapply 41 0.01 0.04 0.05 FALSE base
## 87 vapply 41 0.01 0.07 0.08 FALSE base
## 88 strsplit 42 0.01 0.04 0.05 TRUE base
## 89 FUN 42 0.01 0.07 0.08 FALSE <NA>
## 90 paste 43 0.01 0.07 0.08 TRUE base
(尝试将不同延迟和间隔下的形状与控制台捕获进行比较。)
.您可以使用区块选项engine=“Rscript”
,在单独的R会话中提供评估代码
# R profiling with knitr
```{r engine="Rscript"}
library(profr)
quantile_ex <- profr({Sys.sleep(1); example(quantile, setRNG = TRUE)}, 0.01)
quantile_ex
```
#使用knitr进行分析
```{r engine=“Rscript”}
图书馆(profr)
分位数?我发现rprof
采样器实际上做了几乎正确的事情。它收集调用堆栈样本。(几乎是这样,因为它不报告拨打电话的线路号码。)诀窍是采集少量样本并实际查看它们(或者采集大量样本,但只查看随机选择的少量样本)。最难的是把那些无关紧要的事情都忘掉。描述每个样本中发生的情况。如果您能避免在多个示例中看到它所做的任何事情,都将节省大量时间。谢谢。知道如何在engine=“Rscript”的块中使用rprofm时去掉“##[1]新页面:“getExportedValue”:”?
library(profr)
profr <- function(expr, interval = 0.02, quiet = TRUE) {
tmp <- tempfile()
on.exit(unlink(tmp))
on.exit(unlink("Rprof.out"), add = T)
if (quiet) {
tc <- textConnection(NULL, "w")
sink(tc)
on.exit(sink(), add = TRUE)
on.exit(close(tc), add = TRUE)
}
Rprof(tmp, append = TRUE, interval = interval)
try(force(expr))
Rprof(NULL)
parsed <- parse_rprof(tmp, interval)
which_force <- min(which(parsed$f == "force"))
parsed <- parsed[parsed$level > parsed$level[which_force], ]
parsed$level <- parsed$level - parsed$level[which_force]
parsed
}
quantile_ex <- profr({
Sys.sleep(1)
example(quantile, setRNG = TRUE)
}, 0.01)
quantile_ex
## f level time start end leaf source
## 32 Sys.sleep NA 0.90 0.00 0.90 TRUE base
## 33 example NA 0.03 0.90 0.93 FALSE utils
## 34 <Anonymous> NA 0.03 0.90 0.93 FALSE <NA>
## 35 prepare_Rd NA 0.01 0.90 0.91 FALSE <NA>
## 36 render NA 0.02 0.91 0.93 FALSE <NA>
## 37 .getHelpFile NA 0.01 0.90 0.91 FALSE <NA>
## 38 %in% NA 0.01 0.91 0.92 TRUE base
## 39 of0 NA 0.01 0.92 0.93 FALSE <NA>
## 40 <Anonymous> NA 0.01 0.90 0.91 FALSE <NA>
## 41 of1 NA 0.01 0.92 0.93 FALSE <NA>
## 42 lazyLoadDBexec NA 0.01 0.90 0.91 FALSE base
## 43 WriteLines NA 0.01 0.92 0.93 FALSE <NA>
## 44 fun NA 0.01 0.90 0.91 FALSE <NA>
## 45 writeLines NA 0.01 0.92 0.93 FALSE base
## 46 fetch NA 0.01 0.90 0.91 TRUE <NA>
## 47 paste0 NA 0.01 0.92 0.93 FALSE base
## 48 remap NA 0.01 0.92 0.93 FALSE <NA>
## 49 psub NA 0.01 0.92 0.93 TRUE <NA>
library(profr)
profrk <- function(expr, delay = 1, interval = 0.02, quiet) {
profrk_marker <- function(expr) {
eval(expr)
}
filter <- function(prof.out) {
level.filter <- prof.out$level[which(prof.out == "profrk_marker")] +
2
prof.out <- prof.out[prof.out$level > level.filter, ]
time.offset <- min(prof.out$start)
prof.out$start <- prof.out$start - time.offset
prof.out$end <- prof.out$end - time.offset
prof.out
}
filter(profr({
Sys.sleep(delay)
profrk_marker(substitute(expr))
}, interval = interval, quiet = quiet))
}
pr <- profrk(example(quantile, setRNG = TRUE), delay = 1, interval = 0.01, quiet = TRUE)
print(pr)
## f level time start end leaf source
## 39 example 31 0.08 0.00 0.08 FALSE utils
## 40 index.search 32 0.01 0.00 0.01 FALSE <NA>
## 41 <Anonymous> 32 0.05 0.01 0.06 FALSE <NA>
## 42 source 32 0.02 0.06 0.08 FALSE base
## 43 readRDS 33 0.01 0.00 0.01 FALSE base
## 44 prepare_Rd 33 0.02 0.01 0.03 FALSE <NA>
## 45 RdTags 33 0.01 0.03 0.04 FALSE <NA>
## 46 of0 33 0.01 0.04 0.05 FALSE <NA>
## 47 render 33 0.01 0.05 0.06 FALSE <NA>
## 48 srcfilecopy 33 0.01 0.06 0.07 FALSE base
## 49 withVisible 33 0.01 0.07 0.08 FALSE base
## 50 gzfile 34 0.01 0.00 0.01 TRUE base
## 51 .getHelpFile 34 0.02 0.01 0.03 FALSE <NA>
## 52 sapply 34 0.01 0.03 0.04 FALSE base
## 53 of1 34 0.01 0.04 0.05 FALSE <NA>
## 54 of0 34 0.01 0.05 0.06 FALSE <NA>
## 55 file.info 34 0.01 0.06 0.07 FALSE base
## 56 eval 34 0.01 0.07 0.08 FALSE base
## 57 <Anonymous> 35 0.02 0.01 0.03 FALSE <NA>
## 58 simplify2array 35 0.01 0.03 0.04 FALSE base
## 59 WriteLines 35 0.01 0.04 0.05 FALSE <NA>
## 60 of1 35 0.01 0.05 0.06 FALSE <NA>
## 61 .POSIXct 35 0.01 0.06 0.07 FALSE base
## 62 eval 35 0.01 0.07 0.08 FALSE base
## 63 lazyLoadDBexec 36 0.02 0.01 0.03 FALSE base
## 64 unique 36 0.01 0.03 0.04 TRUE base
## 65 writeLines 36 0.01 0.04 0.05 FALSE base
## 66 WriteLines 36 0.01 0.05 0.06 FALSE <NA>
## 67 structure 36 0.01 0.06 0.07 TRUE base
## 68 quantile 36 0.01 0.07 0.08 FALSE stats
## 69 readRDS 37 0.01 0.01 0.02 TRUE base
## 70 fun 37 0.01 0.02 0.03 FALSE <NA>
## 71 paste0 37 0.01 0.04 0.05 FALSE base
## 72 writeLines 37 0.01 0.05 0.06 FALSE base
## 73 quantile.default 37 0.01 0.07 0.08 FALSE stats
## 74 fetch 38 0.01 0.02 0.03 FALSE <NA>
## 75 wr 38 0.01 0.04 0.05 FALSE <NA>
## 76 paste0 38 0.01 0.05 0.06 FALSE base
## 77 paste 38 0.01 0.07 0.08 FALSE base
## 78 <Anonymous> 39 0.01 0.02 0.03 FALSE <NA>
## 79 paste0 39 0.01 0.04 0.05 FALSE base
## 80 remap 39 0.01 0.05 0.06 FALSE <NA>
## 81 formatC 39 0.01 0.07 0.08 FALSE base
## 82 getFromFrame 40 0.01 0.02 0.03 TRUE <NA>
## 83 strwrap 40 0.01 0.04 0.05 FALSE base
## 84 psub 40 0.01 0.05 0.06 TRUE <NA>
## 85 blank.chars 40 0.01 0.07 0.08 FALSE <NA>
## 86 lapply 41 0.01 0.04 0.05 FALSE base
## 87 vapply 41 0.01 0.07 0.08 FALSE base
## 88 strsplit 42 0.01 0.04 0.05 TRUE base
## 89 FUN 42 0.01 0.07 0.08 FALSE <NA>
## 90 paste 43 0.01 0.07 0.08 TRUE base
plot(pr)
# R profiling with knitr
```{r engine="Rscript"}
library(profr)
quantile_ex <- profr({Sys.sleep(1); example(quantile, setRNG = TRUE)}, 0.01)
quantile_ex
```
## f level time start end leaf source
## 8 example 1 0.02 0.00 0.02 FALSE utils
## 9 <Anonymous> 2 0.01 0.00 0.01 FALSE <NA>
## 10 source 2 0.01 0.01 0.02 FALSE base
## 11 .Rd_format_title 3 0.01 0.00 0.01 FALSE <NA>
## 12 withVisible 3 0.01 0.01 0.02 FALSE base
## 13 gsub 4 0.01 0.00 0.01 FALSE base
## 14 eval 4 0.01 0.01 0.02 FALSE base
## 15 .Rd_get_title 5 0.01 0.00 0.01 FALSE <NA>
## 16 eval 5 0.01 0.01 0.02 FALSE base
## 17 .Rd_get_section 6 0.01 0.00 0.01 FALSE <NA>
## 18 quantile 6 0.01 0.01 0.02 FALSE stats
## 19 RdTags 7 0.01 0.00 0.01 FALSE <NA>
## 20 quantile.default 7 0.01 0.01 0.02 FALSE stats
## 21 sapply 8 0.01 0.00 0.01 FALSE base
## 22 sort 8 0.01 0.01 0.02 FALSE base
## 23 lapply 9 0.01 0.00 0.01 FALSE base
## 24 sort.default 9 0.01 0.01 0.02 FALSE base
## 25 [[ 10 0.01 0.00 0.01 TRUE base
## 26 sort.int 10 0.01 0.01 0.02 FALSE base
## 27 unique 11 0.01 0.01 0.02 TRUE base