2016-10-08 18 views
5

Tôi đang sử dụng rmarkdown::render("script.r") để tạo phiên bản HTML của tập lệnh R. Đầu ra bắt đầu bằng script.r làm tiêu đề, thông tin đăng nhập của tôi là tác giả và date hiện tại là ngày. Tôi không muốn tiết lộ thông tin đăng nhập, cũng như lịch làm việc của mình ..Sử dụng rmarkdown :: render để đặt tiêu đề tài liệu (tiêu đề, tác giả, ngày)

Tôi biết siêu dữ liệu này (tiêu đề, tác giả, ngày) có thể được đặt trong khối YAML bên trong tệp Rmd, nhưng tôi muốn tránh tạo/chỉnh sửa tệp này và chỉ làm việc với tập lệnh R gốc.

Có cách nào để đặt siêu dữ liệu (tiêu đề, tác giả, ngày) qua rmarkdown::render hoặc các chức năng khác như knitr::opts_chunk$set không?

Hoặc, siêu dữ liệu này có thể được đặt bên trong tập lệnh R không?

Hãy tránh gợi ý rằng tôi nên viết một tập tin Rmd thay vì ..

Trả lời

2

Các tài liệu Rmarkdown (xem ?compile_notebook) mô tả một cách để làm điều này bằng cách đưa vào một lời nhận xét định dạng đặc biệt trong tập tin script.R của bạn.

Ví dụ: bao gồm nhận xét này trong tập lệnh của bạn để đặt tiêu đề, tác giả và ngày tháng.

#' --- 
#' title: "Crop Analysis Q3 2013" 
#' author: "John Smith" 
#' date: "May 3rd, 2014" 
#' --- 

này sẽ cung cấp cho bạn kết quả như sau:

rmarkdown_output

+0

Cảm ơn rất nhiều, ngạc nhiên khi họ không đề cập đến điều này trong '? Render', và nó thậm chí không nằm trong phần ** Xem thêm **. – ggll

+0

@ggll cảm ơn nếu nó hoạt động có thể vui lòng đánh dấu vào câu trả lời? –

+0

@ggll Điểm trong câu trả lời đã xóa của tôi là câu hỏi sau: kiểu được định dạng này không dành riêng cho siêu dữ liệu. Nó hoạt động như sau: mỗi dòng sau khi một '# '' được trả về nguyên văn trong tệp 'md', cho dù đó là siêu dữ liệu hay cái gì khác. Đó là lý do tại sao tôi muốn hướng bạn đến '? Knitr :: spin' để biết thêm thông tin về kiểu được định dạng này. –

1

Tôi không biết nếu điều này là một giải pháp đặc biệt là tuyệt vời, nhưng nó quá dài cho một chú thích, vì vậy ở đây đi. Tôi đã xem số rmarkdown::render và tôi không nghĩ điều bạn muốn là có thể trừ khi bạn tự xác định lại số render. Nhìn vào dòng 85 và trở đi:

metadata <- paste("\n", "---\n", "title: \"", input, 
        "\"\n", "author: \"", Sys.info()[["user"]], "\"\n", 
        "date: \"", date(), "\"\n", "---\n", sep = "") 
if (!identical(encoding, "native.enc")) 
    metadata <- iconv(metadata, to = encoding) 
cat(metadata, file = knit_input, append = TRUE) 

Điều này không được kiểm soát bởi bất kỳ điều kiện nào. Vì vậy, một cách lộn xộn là xác định lại render và thay thế một trong các dòng của nó. Tôi mượn một câu trả lời hữu ích cho câu hỏi này: Editing R functions

body(render)[[25]] <- substitute(
    if (identical(tolower(tools::file_ext(input)), "r")) { 
    spin_input <- intermediates_loc(file_with_meta_ext(input, 
                "spin", "R")) 
    file.copy(input, spin_input, overwrite = TRUE) 
    intermediates <- c(intermediates, spin_input) 
    spin_rmd <- knitr::spin(spin_input, knit = FALSE, envir = envir, 
         format = "Rmd") 
    intermediates <- c(intermediates, spin_rmd) 
    knit_input <- spin_rmd 

    # Our edited code starts here! 
    metadata <- paste("\n", "---\n", "title: \"", getOption("yaml_title"), "\"\n", 
        "author: \"", getOption("yaml_author"), "\"\n", "date: \"", 
        getOption("yaml_date"), "\"\n", "---\n", sep = "") 
    # Our edited code ends here! 

    if (!identical(encoding, "native.enc")) 
     metadata <- iconv(metadata, to = encoding) 
    cat(metadata, file = knit_input, append = TRUE) 
    } 
) 

Bây giờ, tập tin của tôi junk.r là như sau:

plot(mtcars$mpg, mtcars$hp) 

và bây giờ render("junk.r") mang lại cho tôi ...

enter image description here

Bây giờ bạn có thể sử dụng options để sử dụng các mục nhập của riêng bạn cho tiêu đề, tác giả và/hoặc ngày hoặc để lại nó k. Tất nhiên, sẽ dễ dàng hơn khi chỉnh sửa tệp .r hoặc tạo tệp .Rmd nhưng bạn đã loại trừ chúng ra.

+1

Tôi đã nhận thấy cùng một đoạn mã, nhưng tôi nghĩ nó chỉ đặt giá trị mặc định. – ggll

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