2013-09-07 63 views
6

Đây là một yêu cầu cực kỳ đơn giản, và tôi không thể tin rằng tôi đã không tìm thấy giải pháp cho điều này được nêu ra, nhưng tôi đã được tìm kiếm cho nó xa và rộng mà không có may mắn.ESS & Knitr/Sweave: Làm thế nào để nguồn tập tin Rnw vào một phiên tương tác?

Tôi có một tệp .Rnw được tải trong Emacs, tôi sử dụng M-n s để biên dịch. Mọi thứ hoạt động tốt và thậm chí sẽ mở bộ đệm R. Tuyệt quá. Nhưng bộ đệm đó hoàn toàn vô dụng: nó không chứa các đối tượng mà tôi chỉ có nguồn gốc!

Ví dụ tối thiểu .Rnw file:

\documentclass{article} 
\begin{document} 
<<>>= 
    foo <- "bar" 
@ 
\end{document} 

Sử dụng M-n s, bây giờ tôi có một R-đệm mới với một phiên nạp lên, nhưng:

> foo 
Error: object 'foo' not found 

Đó là đáng thất vọng. Tôi muốn chơi xung quanh với dữ liệu tương tác. Làm cách nào để đạt được điều đó? Tôi không muốn tìm nguồn cung cấp tệp theo từng dòng hoặc từng khu vực với C-c C-c hoặc một cái gì đó tương tự mỗi lần tôi thay đổi mã của mình. Lý tưởng nhất, nó phải giống như chức năng nguồn của RStudio, nó để lại cho tôi một phiên R được chuẩn bị đầy đủ.

Tôi chưa thử điều này với sweave, chỉ với knitr.

CHỈNH SỬA: tùy chọn đoạn eval=TRUE dường như không dẫn đến hành vi đúng.

Trả lời

6

Hành vi này gần đây đã được thay đổi trong ESS. Bây giờ sweave và knitr được thực hiện trực tiếp trong môi trường toàn cầu, như thể khi bạn tự viết nó ở dòng lệnh. Vì vậy, chờ một vài tuần nữa cho đến khi ESSv13.09 ra hoặc sử dụng phiên bản phát triển.

Hoặc, bạn cũng có thể đặt ess-swv-processing-command thành "% s (% s)" và bạn sẽ nhận được kết quả tương tự, ngoại trừ tải thư viện tự động.

Đối với bản ghi, đan (ngược lại với sweave) đánh giá mọi thứ trong môi trường riêng của nó trừ khi bạn hướng dẫn cách khác.

[chỉnh sửa: Đã xảy ra sự cố. Tôi không thấy chính xác .ess_weave nữa. Có lẽ một số git cam kết messup một lần nữa. Vì vậy, nó không cố định trong 13.09. Sửa nó ngay bây giờ. Xin lỗi.]

+0

cụ thể, 'đan'' đánh giá mã trong' parent.frame() 'theo mặc định, trừ khi bạn' đan (..., envir = globalenv()) '(đôi khi' cha mẹ.frame() 'chỉ là' globalenv() ', và đôi khi nó không phải là) –

+0

Rất vui khi biết rằng bạn đã sửa lỗi này. Cảm ơn! Dọc theo dòng nhận xét của @ Yihui, tôi đã tự sửa lỗi này bằng cách chỉnh sửa '.ess_weave()' trong '" $ EMACS_HOME/site-lisp/ess/etc/ESSR.R "' để sử dụng 'envir = parent .frame (2) '(như trong' lệnh (tập tin, envir = parent.frame (2)) '), chứ không phải' '' '' '' mặc định 'envir = parent.frame()'. (Tôi chỉ là một người dùng ** knitr ** trong những ngày này, vì vậy tôi không chắc chắn cách chỉnh sửa đó chơi với Sweave.) –

+0

Cảm ơn bạn đã phản hồi! Thiết lập 'ess-swv-processing-command' đã không thực hiện thủ thuật cho tôi, nhưng tôi đang xem xét sử dụng' envir = globalenv() 'ngay bây giờ. Tôi không nghĩ rằng tôi muốn chuyển sang phiên bản phát triển, nhưng tôi sẽ xem ESS ngược dòng như một con chim ưng :-) –

6

Mở phiên R tương tác và sau đó gọi trực tiếp từ Sweave, tôi tin như thế này (chưa được kiểm tra). knitr hoạt động theo cùng một cách, mặc dù bạn cần tải thư viện knitr trước.

> Sweave("yourfile.Rnw") 

Có một số nguy cơ tiềm ẩn ở đây. Nếu bạn gọi Sweave trong một phiên sau khi thực hiện những việc khác, mã của bạn có thể sử dụng những thứ trước đó trong không gian làm việc, do đó làm cho kết quả của bạn không thể sản xuất được.

+0

Đó là một chút kludge, nhưng ít nhất nó hoạt động. Cách đan chính xác để làm điều đó có vẻ là knitr :: knit ("file.Rnw"). Vì lợi ích của khả năng tái sản xuất, người ta có lẽ nên sử dụng 'rm (list = ls())' trước để các đối tượng cũ không can thiệp. Vì vậy, tôi đoán tùy chọn duy nhất của tôi là ràng buộc điều này với một số phím tắt bằng cách nào đó… –

+0

Tôi thấy, không nhận ra bạn đang tìm kiếm một khóa ràng buộc ESS cho việc này. Rất vui được nghe bạn tìm thấy một câu trả lời khác phù hợp với bạn. – Aaron