2009-09-19 22 views
19

爲了教導和準備關於R的書面說明,我總是感到沮喪的一件事是,我不能簡單地複製來自R的命令和輸出並將它們粘貼到另一個R會話中。舉例來說,如果我做的一些小事,比如更改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 

如果我複製並粘貼到文檔,甚至在這裏這篇文章,你(和我的學生)不能再僅僅強調它,將它複製並將其粘貼到R對話成功

> > 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 

你可能想這樣做是爲了測試你的R安裝,我的輸出比較你的,或者乾脆利用我提供的功能。

所以,我希望能夠做的是將缺省提示符從>更改爲空字符串或空白區域,並且還將所有輸出行用哈希標記#作爲前綴。這樣一來,我可以用[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 

可能是複製/粘貼到R對話成功。這將使我爲期刊文章,學生,講座等準備R代碼對我來說更容易(也可能用於其他人)?

我在沒有運氣的情況下翻閱了文檔......任何想法?指針?

目前,我通過R.app GUI或從終端在Mac上使用R.

回答

15

所以,我非常喜歡傑克和馬立克的解決方案。傑克的直截了當,但沒有解決輸出格式化問題的一部分。馬立克氏是有點麻煩,所以我把它包起來的函數導致

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) 
} 

這讓我突出和複製交互式會話的一部分。

因此,例如,我可以用它來

> 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 

複製到剪貼板,並用簡單的調用

> cleanCode() 

產生輸出諸如

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 

其有人可以快速突出顯示並將&粘貼複製到R會話中以執行代碼並比較他們的輸出。當然,在這種情況下,他們會得到不同的結果,因爲我以隨機數據爲基礎的例子。

謝謝傑克,馬雷克和其他人......所有的迴應都很有幫助!

+1

我喜歡它,使用函數是一個好主意。 Ubuntu的太)應該是: to_edit < - readLines(「剪貼板」) – Marek 2009-09-20 20:57:37

+1

cmdPrompts < - gsub(「+」,「\\ +」,cmdPrompts,fixed = TRUE)'將處理+符號。確定有必要將函數概括爲處理其他特殊字符,如果有人知道足以自定義它們的延續提示,那麼他們應該能夠弄清楚如何編輯這個函數。 – drammock 2013-05-08 03:58:45

5

至於改變提示,你要找的命令是options,參數prompt,我發現here

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

在提示設置爲空字符串的結果:

​​

這就是爲什麼我用了評論。據我所知,R沒有塊評論,這就是爲什麼我提示行註釋,並在其末尾添加換行符 - 應該是沒有問題,如果有人以這種方式複製粘貼會話。

我還在尋找輸出格式的一點點......這裏有一些代碼this mailling list post似乎格式化輸出沒有[#]塊,但它肯定不是很漂亮。

+0

你是正確的,它必須是一個非空字符串...(不知道爲什麼他們需要....),但單一的空間似乎運作良好:選項(提示=」「) – 2009-09-20 14:34:46

1

你寫

的這總是 的事情之一我感到沮喪的是,我不能簡單地複製 命令和輸出R和 它們粘貼到另一個R對話。

我假設你使用標準R Windows二進制文件在Windows上。我擔心你的想法可能不可行。但是因爲你想要做的事實際上是非常可取的,所以人們以不同的方式做了。從ESS手冊:

5操縱保存轉錄文件

劣質S模式記錄在過程 緩衝器轉錄 (所有命令的執行的列表, 和它們的輸出),其可以被保存作爲 「成績單文件」,其中 通常具有後綴「.St」。 對於成績單文件 最明顯的用途是作爲您在特定會話中執行的動作 的靜態記錄。然而,有時候,您可能希望 通過將 提交給正在運行的ESS進程來重新執行轉錄文件中記錄的 命令。這是 是Transcript模式的用途。

如果您將帶有後綴 的文件a加載到Emacs中,它將被放置在S Transcript模式中。 [...]

切換到Emacs/ESS可能與您的學生不兼容。因此,對於直接複製和粘貼,你最好的選擇可能只是包裝表情到dput()第一:

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> 

最後一個表達式可以剪切並粘貼回R.

3

我有另外兩個建議:

1)您可以在腳本文件中編寫代碼;那麼你可以複製和粘貼代碼沒有任何問題。

從標準的R GUI中,進入File> New Script。在那裏輸入所有的代碼,然後運行它,只需突出顯示代碼並按下CTRL-R即可。許多其他R GUI也有類似的行爲。您仍然可以在此模式下交互式工作;關鍵區別在於您突出顯示代碼並運行它而不是按下ENTER鍵。

2)使用history()函數。查看幫助:?歷史。您可以保存您的控制檯歷史記錄本:

savehistory(file = ".Rhistory")

然後你就可以打開它與這個命令的腳本文件:

edit(file=".Rhistory")

你也可能要改變max.show甚至可能是您自己的.Rprofile中的默認值。例如,

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

+0

你對了。這種方法的問題在於,當你開發教學示例時,與R進行直接數據分析時相比,使用R更加「互動」。您正在玩的功能,選項,輸出風格等等,以至於歷史的正常流動充滿了噪音,而且您希望能夠從該會話中提取正確的一組項目......我有花了相當長的時間瀏覽歷史檔案,試圖找到那一刻,當我有一系列完美的例子時......但是根據我的經驗,這是一個沉沒的時刻。 – 2009-09-20 14:14:29

+0

這是一個公平點。我通常也會發現歷史文件非常混亂。在這種情況下(假設其他提示調整答案都不起作用),我建議只從腳本文件開始逐行運行。找到一個適合你的GUI。這是很容易的實驗,最後你會有一個完整的R文件來教。甚至可以將腳本打包:你會看到幾個關於CRAN的統計課程的例子。 – Shane 2009-09-20 15:27:51

25

您可以試試:

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

注意在引號之間的空間。

第一個選項使提示消失。第二個消除「+」出現在長包裝線上。

+1

這是解決方案的全部一半......我知道提示選項,但不知道繼續選項......這有助於很多。 – 2009-09-20 14:16:06

+0

現在,如果有前綴輸出選項! – 2009-09-20 14:33:19

+0

是否有可能在每個R會話中使其成爲永久的? – qed 2012-10-22 13:44:03

1

不知道這是否支持所有的平臺,但在Windows上,您可以複製,然後右擊並選擇「粘貼命令只」,這不正是你需要的。不幸的是,沒有鍵盤快捷鍵。

+0

在Mac上的R.app似乎不是一個選項.... :( – 2009-09-20 14:18:05

1

在r-help郵件列表上有一個recent discussion,有幾個示例函數可以從粘貼的代碼中去除模擬Windows R GUI的「僅粘貼命令」命令。

5

痛苦的方法是正則表達式的原始輸出。假設你有一些代碼:

x <- rnorm(10) 
    x 

head(USArrests) 

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

可以將其保存到一個文件,然後使用readlines方法讀取變量。我做同樣的,使用上覆印輸出textConnection:

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 
")) 

現在有些編輯:

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 

,其結果是:

> 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 
# 

它的工作原理,但正如我說這是痛苦的。

+0

這使我成爲一個非常可行的解決方案,我將不得不作爲「答案」發佈,因爲評論沒有處理代碼格式化或很長的帖子,看看我的cleanCode()函數,在這個線程中的其他地方...這是馬立克解決方案的一個直接的即興編碼 – 2009-09-20 15:17:13

1

這是相當老,但也可以使用knitr包編寫文檔。這將創建輸出,您可以將其複製/粘貼到R會話中。