2009-09-19 25 views
19

Với mục đích dạy và chuẩn bị các hướng dẫn bằng văn bản về R, một trong những điều luôn khiến tôi thất vọng là tôi không thể sao chép các lệnh và đầu ra từ R và dán chúng vào một phiên R khác. Ví dụ, nếu tôi làm điều gì đó tầm thường, chẳng hạn nhưThay đổi tiền tố dòng nhắc và đầu ra mặc định trong R?

> x <- rnorm(10) 
> x 
[1] 1.76975998 1.19722850 -0.39274507 -1.10979974 0.52320473 -0.08643833 
[7] 0.94437690 0.08083207 0.62260363 1.89305469 

Nếu tôi sao chép và dán vào một tài liệu hoặc thậm chí ở đây trong bài viết này, bạn (và sinh viên của tôi) không thể sau đó chỉ cần làm nổi bật nó, sao chép nó và dán nó vào một phiên R thành công

> > x <- rnorm(10) 
Error: syntax error 
> > x 
Error: syntax error 
> [1] 1.76975998 1.19722850 -0.39274507 -1.10979974 0.52320473 -0.08643833 
Error: syntax error 
> [7] 0.94437690 0.08083207 0.62260363 1.89305469 
Error: syntax error 

Bạn có thể muốn thực hiện việc này để kiểm tra cài đặt R, so sánh đầu ra của tôi hoặc đơn giản sử dụng chức năng tôi đã cung cấp.

Vì vậy, những gì tôi muốn có thể làm là thay đổi lời nhắc mặc định từ> thành chuỗi trống hoặc khoảng trắng và cũng tiền tố tất cả các dòng đầu ra có dấu băm #. Bằng cách đó, tôi có thể sử dụng R tương tác để tạo ra một phiên trông giống như

x <- rnorm(10) 
x 
# [1] 1.76975998 1.19722850 -0.39274507 -1.10979974 0.52320473 -0.08643833 
# [7] 0.94437690 0.08083207 0.62260363 1.89305469 

thể được sao chép/dán vào một phiên R thành công. Nó sẽ làm cho prepping R mã cho một bài báo, sinh viên, bài giảng, vv dễ dàng hơn cho tôi (và có thể cho những người khác?)

Tôi đã poked quanh tài liệu mà không có may mắn ... bất kỳ ý tưởng? con trỏ?

Hiện tại, tôi đang sử dụng R trên máy Mac thông qua R.app GUI hoặc từ Thiết bị đầu cuối.

Trả lời

15

Vì vậy, tôi rất thích các giải pháp của Jake và Marek. Jake là đơn giản, nhưng không giải quyết một phần định dạng đầu ra của vấn đề. Marek là một chút cồng kềnh, vì vậy tôi quấn nó lên trong một chức năng dẫn đến

cleanCode <- function() { 
    if (.Platform$OS.type == "unix" && .Platform$pkgType == "mac.binary") { 
    to_edit <- readLines(pipe("pbpaste")) # Mac ONLY solution 
    } else { 
    to_edit <- readLines("clipboard") # Windows/Unix solution 
    } 
    opts <- options() 
    cmdPrompts <- paste("^", opts$prompt, "|^", opts$continue, sep="") 

    # can someone help me here? how to escape the + to \\+, as well as other special chars 

    id_commands <- grep("^> |^\\+ ", to_edit) # which are command or continuation lines 
    to_edit[id_commands] <- sub("^> |^\\+ ", "", to_edit[id_commands]) # remove prompts 
    to_edit[-id_commands] <- paste(" # ", to_edit[-id_commands]) # comment output 
    writeLines(to_edit) 
} 

cho phép tôi làm nổi bật và sao chép một phần của phiên tương tác.

Vì vậy, ví dụ, tôi có thể sử dụng để sao chép

> x <- rnorm(20) 
> plot(x) 
> summary(x) 
    Min. 1st Qu. Median  Mean 3rd Qu.  Max. 
-2.34000 -0.86010 -0.21940 -0.43340 0.04383 1.06400 
> str(x) 
num [1:20] -1.568 -0.219 -1.951 1.064 0.768 ... 
> sd(x) 
[1] 0.8932958 

vào clipboard và với một cuộc gọi đơn giản để

> cleanCode() 

sản lượng sản xuất như

x <- rnorm(20) 
plot(x) 
summary(x) 
    #  Min. 1st Qu. Median  Mean 3rd Qu.  Max. 
    # -2.34000 -0.86010 -0.21940 -0.43340 0.04383 1.06400 
str(x) 
    # num [1:20] -1.568 -0.219 -1.951 1.064 0.768 ... 
sd(x) 
    # [1] 0.8932958 

mà ai đó có thể nhanh chóng đánh dấu và sao chép & dán vào phiên R để thực thi mã và so sánh đầu ra của họ. Tất nhiên, trong trường hợp này, họ sẽ nhận được kết quả khác nhau, vì tôi dựa trên ví dụ về dữ liệu ngẫu nhiên.

Cảm ơn bạn Jake, Marek và mọi người khác ... tất cả các câu trả lời đều hữu ích!

+1

Tôi thích nó. Ý tưởng hay là sử dụng một hàm cho Windows (và cho Ubuntu quá) trong dòng đầu tiên nên là: to_edit <- readLines ("clipboard") – Marek

+1

'cmdPrompts <- gsub (" + "," \\ + ", cmdPrompts, cố định = TRUE)' sẽ xử lý dấu +. chắc chắn nó là cần thiết để khái quát hóa chức năng để xử lý các ký tự đặc biệt khác.Nếu ai đó biết đủ để tùy chỉnh dấu nhắc tiếp tục của họ, họ nên có thể tìm ra cách để chỉnh sửa chức năng này cho phù hợp. – drammock

5

Để thay đổi lời nhắc, lệnh bạn đang tìm kiếm là options, với đối số prompt, mà tôi đã tìm thấy here.

 
> options(prompt = "# Customized R Prompt!\n") 
# Customized R Prompt! 
1 + 5 
[1] 6 
# Customized R Prompt! 

Thiết lập nhắc đến một kết quả chuỗi rỗng trong:

 
> options(prompt="") 
Error in options(prompt = "") : invalid value for 'prompt' 

Đó là lý do tại sao tôi đã sử dụng một nhận xét. Theo như tôi có thể nói, R không có nhận xét chặn, đó là lý do tại sao tôi đã thực hiện lời nhắc dòng và đặt dòng mới ở cuối dòng - phải là không có vấn đề nào nếu có ai sao chép phiên của bạn theo cách đó .

Tôi vẫn đang tìm định dạng đầu ra cho một chút ở đây ... Có một số mã tại this mailling list post dường như định dạng đầu ra không có khối [#], nhưng chắc chắn không đẹp.

+0

Bạn nói đúng là nó cần phải là một chuỗi không trống ... (tự hỏi tại sao họ yêu cầu ....), nhưng một không gian duy nhất có vẻ hoạt động tốt: tùy chọn (nhắc = "") –

1

Bạn viết rằng

một trong những điều đó là luôn tôi thất vọng là tôi có thể không chỉ đơn giản là sao chép lệnh và đầu ra từ R và dán chúng vào một phiên R.

và tôi cho rằng bạn đang sử dụng Windows với nhị phân R Windows chuẩn. Tôi sợ rằng những gì bạn có trong tâm trí chỉ có thể không được làm được. Nhưng bởi vì những gì bạn muốn làm thực sự là rất mong muốn, mọi người đã làm theo một cách khác.Từ hướng dẫn ESS:

5 Thao tác file bảng điểm lưu

chế độ S Kém ghi bảng điểm (danh sách tất cả các lệnh thực thi, và đầu ra của họ) trong bộ đệm quá trình , mà có thể được lưu dưới dạng "tệp bản ghi", nên thường có hậu tố `.St '. sử dụng rõ ràng nhất cho tệp bản ghi là bản ghi tĩnh của các hành động bạn đã thực hiện trong phiên S cụ thể. Tuy nhiên, đôi khi bạn có thể muốn thực hiện lại các lệnh được ghi lại trong tệp bản ghi bằng cách gửi chúng vào quy trình ESS đang chạy. này là chế độ Transcript Mode.

Nếu bạn tải tệp có hậu tố `.St 'vào Emacs, nó được đặt trong S Chế độ bảng điểm. [...]

Chuyển sang Emacs/ESS có thể không tương thích với sinh viên của bạn. Vì vậy, đối trực tiếp sao chép và dán, đặt cược tốt nhất của bạn có thể chỉ là để bọc biểu thức vào dput() đầu tiên:

R> set.seed(42) 
R> x <- rnorm(10) 
R> x 
[1] 1.37096 -0.56470 0.36313 0.63286 0.40427 -0.10612 1.51152 -0.09466 2.01842 -0.06271 
R> dput(x) 
c(1.37095844714667, -0.564698171396089, 0.363128411337339, 0.63286260496104, 
0.404268323140999, -0.106124516091484, 1.51152199743894, -0.0946590384130976, 
2.01842371387704, -0.062714099052421) 
R> 

Biểu thức cuối cùng có thể được cắt và dán trở lại R.

3

Tôi có hai lời đề nghị khác:

1) Bạn có thể viết mã của mình trong tệp tập lệnh; sau đó bạn có thể sao chép và dán mã mà không gặp bất kỳ sự cố nào.

Từ R GUI chuẩn, hãy đi tới Tệp> Tập lệnh mới. Nhập tất cả mã của bạn vào đó, sau đó để chạy nó, chỉ cần đánh dấu mã và nhấn CTRL-R. Nhiều R GUI khác có hành vi tương tự. Bạn vẫn có thể làm việc tương tác trong chế độ này; sự khác biệt chính là bạn làm nổi bật mã và chạy nó thay vì nhấn ENTER.

2) Sử dụng các chức năng history(). Xem trợ giúp:? History. Bạn có thể lưu lịch sử giao diện điều khiển của bạn với điều này:

savehistory(file = ".Rhistory")

Sau đó, bạn có thể mở nó như một tập tin kịch bản với lệnh này:

edit(file=".Rhistory")

Bạn cũng có thể muốn thay đổi max.show , thậm chí có thể là mặc định trong .Rprofile của riêng bạn. Ví dụ,

history(max.show = Inf, reverse = FALSE)

+0

Bạn đúng rồi. Vấn đề với cách tiếp cận này là khi một người đang phát triển các ví dụ dạy học, bạn thậm chí còn thường xuyên hơn "tương tác" làm việc với R hơn là khi thực hiện phân tích dữ liệu thẳng. Bạn đang chơi với các tính năng, tùy chọn, kiểu đầu ra, v.v ... đến mức dòng chảy bình thường của lịch sử được lấp đầy với tiếng ồn và bạn muốn có thể trích xuất đúng tập hợp các mục từ phiên đó ... Tôi có đã dành một lượng thời gian hợp lý để xem qua các tập tin lịch sử, cố gắng tìm một khoảnh khắc khi tôi có một loạt các ví dụ hoàn hảo ... nhưng đó là một thời gian chìm, theo kinh nghiệm của tôi. –

+0

Đó là một điểm công bằng. Tôi thường thấy tệp lịch sử cũng rất lộn xộn. Trong trường hợp đó (giả sử không có câu trả lời điều chỉnh nhắc nào khác hoạt động), tôi đề nghị chỉ làm việc từ một tệp kịch bản và chạy từng dòng một. Tìm GUI phù hợp với bạn. Rất dễ dàng để thử nghiệm và cuối cùng bạn sẽ có một tệp R hoàn chỉnh để giảng dạy. Bạn thậm chí có thể đi xa như vậy để đóng gói kịch bản của bạn: bạn sẽ thấy một số ví dụ về các khóa học thống kê trên CRAN. – Shane

25

Bạn có thể thử:

options(prompt=" ", continue=" ")

Lưu ý các không gian ở giữa dấu ngoặc kép.

Tùy chọn đầu tiên làm cho lời nhắc biến mất. Thứ hai xóa "+" xuất hiện trên các dòng gói dài.

+1

Đây là một nửa đầy đủ của giải pháp ... Tôi biết về tùy chọn nhắc, nhưng không phải là tùy chọn tiếp tục ... giúp, rất nhiều. –

+0

Bây giờ, nếu có tùy chọn tiền tố! –

+0

Có thể thực hiện điều này vĩnh viễn cho mỗi phiên R không? – qed

1

Không chắc chắn điều này có được hỗ trợ trên mọi nền tảng hay không, nhưng trên Windows, bạn có thể sao chép, sau đó nhấp chuột phải và chọn "Chỉ dán lệnh", thực hiện chính xác những gì bạn cần. Thật không may, không có phím tắt.

+0

Dường như không phải là một tùy chọn trong R.app trên Mac ....: ( –

1

Có một recent discussion trên danh sách gửi thư hỗ trợ r với một số chức năng ví dụ để tách> từ mã được dán để bắt chước lệnh "Chỉ lệnh dán" của Windows R GUI.

5

Cách gây đau đớn là lấy lại một đầu ra ban đầu. Giả sử bạn có một số mã:

x <- rnorm(10) 
    x 

head(USArrests) 

lm(y~x+z, 
    data.frame(y=rnorm(10),z=runif(10),x=rbinom(10,2,.5)) 
) 

Bạn có thể lưu mã vào tệp và sau đó sử dụng readLines được đọc thành biến. Tôi làm như vậy, sử dụng textConnection về sản lượng sao chép:

to_edit <- readLines(textConnection(" 
> x <- rnorm(10) 
> x 
[1] -0.43409069 -1.05399275 1.53440218 0.05812936 1.62713995 -1.20644184 
[7] -0.15698798 -2.36494897 -0.14440292 1.47182117 
> 
> head(USArrests) 
      Murder Assault UrbanPop Rape 
Alabama  13.2  236  58 21.2 
Alaska  10.0  263  48 44.5 
Arizona  8.1  294  80 31.0 
Arkansas  8.8  190  50 19.5 
California 9.0  276  91 40.6 
Colorado  7.9  204  78 38.7 
> 
> lm(y~x+z, 
+ data.frame(y=rnorm(10),z=runif(10),x=rbinom(10,2,.5)) 
+) 

Call: 
lm(formula = y ~ x + z, data = data.frame(y = rnorm(10), z = runif(10),  x = rbinom(10, 2, 0.5))) 

Coefficients: 
(Intercept)   x   z 
    -0.6460  0.3678  0.3918 
")) 

Bây giờ một số chỉnh sửa:

id_commands <- grep("^> |^\\+ ",to_edit) # which are commands or its continuity 
to_edit[id_commands] <- sub("^> |^\\+ ","",to_edit[id_commands]) # remove promt 
to_edit[-id_commands] <- paste("#",to_edit[-id_commands]) # comment output 

Và kết quả là:

> writeLines(to_edit) # you can specify file or write on screen 
# 
x <- rnorm(10) 
    x 
# [1] -0.43409069 -1.05399275 1.53440218 0.05812936 1.62713995 -1.20644184 
# [7] -0.15698798 -2.36494897 -0.14440292 1.47182117 

head(USArrests) 
#   Murder Assault UrbanPop Rape 
# Alabama  13.2  236  58 21.2 
# Alaska  10.0  263  48 44.5 
# Arizona  8.1  294  80 31.0 
# Arkansas  8.8  190  50 19.5 
# California 9.0  276  91 40.6 
# Colorado  7.9  204  78 38.7 

lm(y~x+z, 
data.frame(y=rnorm(10),z=runif(10),x=rbinom(10,2,.5)) 
) 
# 
# Call: 
# lm(formula = y ~ x + z, data = data.frame(y = rnorm(10), z = runif(10),  x = rbinom(10, 2, 0.5))) 
# 
# Coefficients: 
# (Intercept)   x   z 
#  -0.6460  0.3678  0.3918 
# 

Nó hoạt động nhưng như tôi đã nói nó đau đớn.

+0

Điều này dẫn tôi đến một giải pháp khá khả thi, mà tôi sẽ phải đăng là "câu trả lời", vì các nhận xét không hãy xem hàm cleanCode() của tôi, ở đâu đó trong chủ đề này ... đó là một cách riff trực tiếp trên giải pháp của Marek –

1

Điều này khá cũ nhưng bạn có thể viết tài liệu bằng cách sử dụng gói knitr. Điều này tạo ra đầu ra mà bạn chỉ có thể sao chép/dán vào một phiên R.

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