2014-07-15 17 views
15

Tôi có một tài liệu .Rmd mà quá trình đan chỉ tốt.knitr: chạy tất cả các khối trong tài liệu Rmarkdown

Tôi muốn chạy tất cả các đoạn trong tài liệu, để tôi có thể khám phá các kết quả trong vỏ R của tôi.

Trong Rstudio có một tùy chọn để chạy tất cả các khối trong tài liệu, nhưng tôi không thể tìm cách để đạt được hiệu ứng tương tự trong phiên R đơn giản (mở trong thiết bị đầu cuối của tôi).

Có cách nào để thực hiện việc này không?

Trả lời

15

Sử dụng Run all chunks tương đương với:

  • Tạo một file R tạm
  • Sử dụng knitr::purl để trích xuất tất cả các khối R vào tập tin tạm thời
  • Sử dụng source() để chạy các tập tin
  • Xóa tệp tạm thời

Như sau:

tempR <- tempfile(fileext = ".R") 
library(knitr) 
purl("SO-tag-package-dependencies.Rmd", output=tempR) 
source(tempR) 
unlink(tempR) 

Nhưng bạn sẽ muốn biến điều này thành một hàm. Đây là dễ dàng đủ, ngoại trừ bạn phải sử dụng sys.source để chạy các kịch bản R trong môi trường toàn cầu:

runAllChunks <- function(rmd, envir=globalenv()){ 
    tempR <- tempfile(tmpdir = ".", fileext = ".R") 
    on.exit(unlink(tempR)) 
    knitr::purl(rmd, output=tempR) 
    sys.source(tempR, envir=envir) 
} 

runAllChunks("SO-tag-package-dependencies.Rmd") 
+1

Tôi chỉ thêm vào để làm trung gian nó một chút nhưng nó hoạt động như một nhà vô địch! đây là sửa đổi của tôi: runAllChunks <- chức năng (rmd, envir = globalenv()) { tempR <- tempfile (tmpdir = ".", Fileext = ".R") knitr :: purl (rmd, output = tempR) sys.source (tempR, envir = envir) hủy liên kết (tempR) } – lucacerone

+0

@lucacerone Cảm ơn bạn đã tìm ra lỗi trong mã của tôi và để cung cấp bản sửa lỗi của bạn. Tôi đã chỉnh sửa câu trả lời để phản ánh điều này. – Andrie

2

Bạn thậm chí không cần phải sử dụng purl(): nếu bạn knit tài liệu trong R console, mã được đánh giá trong môi trường toàn cục (theo mặc định, xem tùy chọn envir= tới knit()).

Vì vậy, nếu tập tin của bạn là my.Rmd, sau đó chỉ cần chạy

library(knitr) 
knit('my.Rmd') 

Một thủ thuật tiện dụng: nếu bạn chỉ muốn chạy đến một điểm nhất định trong tài liệu, chèn một lỗi như:

stop('here') 

tại điểm trong một đoạn mã bạn muốn nó dừng lại, và thiết lập các tùy chọn knitr sau:

opts_chunk $ set (lỗi = FALSE)

trong bảng điều khiển trước khi chạy knit().

Các vấn đề liên quan