2011-11-09 30 views
7

Giả sử tôi có tệp .Rnw chứa LaTex thông thường được trộn lẫn với các đoạn mã R. (Tôi đặc biệt quan tâm đến việc chuyển đổi tài liệu trang trình bày .Rnw, nhưng câu hỏi này áp dụng cho bất kỳ tài liệu .Rnw nào). Bây giờ tôi muốn chuyển đổi tệp này thành tệp chứa tất cả mã R, cộng với tất cả văn bản thường được tạo bởi LaTex, dưới dạng R nhận xét. Nói cách khác, chức năng tôi muốn tương tự như những gì Stangle() thực hiện, nhưng tôi cũng muốn tất cả phần văn bản của LaTex được chuyển thành văn bản thuần túy được nhận xét trong tệp .R kết quả.Sweave, R, Beamer: Cách chuyển đổi văn bản LaTex trong một tập tin Rnw thành R bình luận?

Đây sẽ là một cách rất thuận tiện để tự động tạo tệp R đã nhận xét dễ dàng xem trong trình chỉnh sửa đánh dấu cú pháp yêu thích của bạn (ví dụ: emacs). Điều này có vẻ không phải là một ý tưởng tuyệt vời cho một tài liệu Sweave đó là một bài viết dài chỉ có một chút mã R, nhưng nó bắt đầu trông hấp dẫn khi tài liệu .Rnw thực sự là một bản trình bày slide (ví dụ: sử dụng beamer) - sau đó phần văn bản các trang trình bày sẽ đưa ra các nhận xét hoàn hảo cho mã R.

Bất kỳ ai có ý tưởng về cách thực hiện việc này? Cảm ơn trước.

Trả lời

8

Đây là một cách tiếp cận sử dụng regex. Vẫn còn một số vấn đề vẫn còn, và tôi sẽ duy trì một danh sách sẽ được cập nhật với các nghị quyết.

# READ LINES FROM RNW FILE 
lines <- readLines('http://users.stat.umn.edu/~charlie/Sweave/foo.Rnw') 

# DETECT CODE LINES USING SWEAVE CHUNK DEFINITIONS 
start_chunk <- grep("^<<.*=$", lines) 
end_chunk <- grep("^@" , lines) 
r_lines  <- unlist(mapply(seq, start_chunk + 1, end_chunk - 1)) 

# COMMENT OUT NON CODE LINES AND WRITE TO FILE 
lines[-r_lines] <- paste("##", lines[-r_lines]) 
writeLines(lines, con='codefile.R') 

CÁC VẤN ĐỀ CÒN LẠI:

  1. Không đối phó tốt với khối gọi là bên trong khối khác sử dụng <<chunk_name>>
+0

Bạn có thể muốn xác định regex phức tạp hơn để hàn gắn các đoạn đặt tên vấn đề, như: '"^<<.*>> =? $ "' Cho đoạn bắt đầu. Nhưng đó là cách tiếp cận rất gọn gàng, dù sao ... sử dụng tốt 'mapply'. – aL3xa

+0

Đó là một cách tiếp cận gọn gàng, và có, sử dụng tốt 'mapply'. Một điều nữa sẽ tốt hơn là loại bỏ tất cả các đánh dấu 'LaTeX' (những thứ như' \ begin {frame} ',' \ frametitle', ...) để tạo ra các nhận xét thuần túy, thuần túy - Ít nhất, loại bỏ tất cả các từ khóa LaTeX sẽ là một sự khởi đầu. Tôi cho rằng người ta có thể viết một 'regex' để thay thế tất cả các từ dành riêng của LaTeX bằng các chuỗi rỗng. Đó sẽ là một sự khởi đầu, nhưng tôi hy vọng có một số cách để tận dụng bộ phân tích LaTeX, và bằng cách nào đó nắm bắt * văn bản * mà mủ cao su sẽ tạo ra. –

+0

Kết hợp ý tưởng của @ Ramnath với một trong các giải pháp LaTeX-to-text từ một câu hỏi SO khác (http://stackoverflow.com/questions/530121/how-do-i-convert-latex-to-plain-text-ascii) có thể giúp tôi những gì tôi muốn. –

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