2013-03-07 22 views

Trả lời

65

Khi ai đó đã viết trong nhận xét, bạn không phải sử dụng chú mèo trước readline(). Đơn giản chỉ cần viết:

readline(prompt="Press [enter] to continue") 

Nếu bạn không muốn gán nó vào một biến và không muốn quay trở lại in trong giao diện điều khiển, quấn readline() trong một invisible():

invisible(readline(prompt="Press [enter] to continue")) 
+0

Tôi nghĩ đây là câu trả lời hay nhất ở đây. –

68

Phương pháp 1

Waits cho đến khi bạn nhấn [Enter] trong giao diện điều khiển:

cat ("Press [enter] to continue") 
line <- readline() 

Wrapping vào một chức năng:

readkey <- function() 
{ 
    cat ("Press [enter] to continue") 
    line <- readline() 
} 

Chức năng này là tương đương với tốt nhất của Console.ReadKey() trong C#.

Phương pháp 2

Tạm dừng cho đến khi bạn gõ [nhập] tổ hợp phím trên bàn phím. Nhược điểm của phương pháp này là nếu bạn gõ một cái gì đó mà không phải là một số, nó sẽ hiển thị một lỗi.

print ("Press [enter] to continue") 
number <- scan(n=1) 

Wrapping vào một chức năng:

readkey <- function() 
{ 
    cat("[press [enter] to continue]") 
    number <- scan(n=1) 
} 

Phương pháp 3

Hãy tưởng tượng bạn muốn chờ đợi cho một phím nhấn trước âm mưu một điểm khác trên một đồ thị. Trong trường hợp này, chúng ta có thể sử dụng hàm getGraphicsEvent() để đợi một lần nhấn phím trong một biểu đồ.

chương trình mẫu này minh họa các khái niệm:

readkeygraph <- function(prompt) 
{ 
    getGraphicsEvent(prompt = prompt, 
       onMouseDown = NULL, onMouseMove = NULL, 
       onMouseUp = NULL, onKeybd = onKeybd, 
       consolePrompt = "[click on graph then follow top prompt to continue]") 
    Sys.sleep(0.01) 
    return(keyPressed) 
} 

onKeybd <- function(key) 
{ 
    keyPressed <<- key 
} 

xaxis=c(1:10) # Set up the x-axis. 
yaxis=runif(10,min=0,max=1) # Set up the y-axis. 
plot(xaxis,yaxis) 

for (i in xaxis) 
{ 
    # On each keypress, color the points on the graph in red, one by one. 
    points(i,yaxis[i],col="red", pch=19) 
    keyPressed = readkeygraph("[press any key to continue]") 
} 

đây bạn có thể xem đồ thị, với một nửa số điểm của nó màu, chờ đợi cho các tổ hợp phím sau trên bàn phím.

Khả năng tương thích: Được thử nghiệm trong môi trường sử dụng win.graph hoặc X11. Làm việc với Windows 7 x64 với Revolution R v6.1. Không hoạt động trong RStudio (vì nó không sử dụng win.graph).

enter image description here

+5

Phương pháp 1 có thể được rút ngắn bằng cách sử dụng đối số 'prompt' cho' readline'. Phương thức 2 sẽ làm việc với bất kỳ đầu vào nào (không chỉ các số) nếu 'what =" "' được thêm vào lệnh gọi 'scan'. 'getGraphicsEvent' chỉ hoạt động trên các thiết bị đồ họa cụ thể trên các nền tảng nhất định (nhưng nếu bạn đang sử dụng một trong các thiết bị đó thì nó hoạt động tốt). –

+2

'readline' và' scan' không hoạt động trong dòng lệnh dưới Linux –

+2

Nếu bạn đang sử dụng hàm này (Phương pháp 1) trong vòng lặp và muốn dừng vòng lặp, hãy bao gồm ví dụ: 'if (line ==" Q ") stop()' –

17

Đây là một chức năng nhỏ (sử dụng gói tcltk) mà sẽ mở ra một cửa sổ nhỏ và chờ cho đến khi bạn hoặc nhấp vào nút tiếp tục hoặc nhấn phím bất kỳ (trong khi cửa sổ nhỏ vẫn có focus) , sau đó nó sẽ cho phép kịch bản của bạn tiếp tục.

library(tcltk) 

mywait <- function() { 
    tt <- tktoplevel() 
    tkpack(tkbutton(tt, text='Continue', command=function()tkdestroy(tt)), 
     side='bottom') 
    tkbind(tt,'<Key>', function()tkdestroy(tt)) 

    tkwait.window(tt) 
} 

Chỉ cần đặt mywait() vào tập lệnh của bạn ở bất kỳ nơi nào bạn muốn tập lệnh tạm dừng.

Tính năng này hoạt động trên bất kỳ nền tảng nào hỗ trợ tcltk (mà tôi nghĩ là tất cả), sẽ phản hồi bất kỳ phím bấm nào (không chỉ nhập) và thậm chí hoạt động khi tập lệnh được chạy ở chế độ hàng loạt (nhưng vẫn tạm dừng ở chế độ hàng loạt, vì vậy nếu bạn không ở đó để tiếp tục, nó sẽ chờ mãi mãi). Có thể thêm bộ hẹn giờ để làm cho bộ hẹn giờ tiếp tục sau một khoảng thời gian được đặt nếu không được nhấp hoặc có phím được nhấn.

Nó không trả lại phím nào đã được nhấn (nhưng có thể được sửa đổi để làm như vậy).

+0

Thật tuyệt vời. Nhưng chỉ là một cảnh báo, nó sẽ không chạy trên webstient RStudio-Server, vì một số lý do ('Lỗi trong cấu trúc (.External (.C_dotTclObjv, objv), class =" tclObj "): [tcl] tên lệnh không hợp lệ" toplevel ".') – milia

+1

@ milia, đúng vậy. Mã dựa trên tcltk cần chạy trên máy cục bộ và sẽ không chạy trên RStudio-Server. –

11

R và Rscript đều gửi '' để đọc và quét ở chế độ không tương tác (xem ? readline). Giải pháp là buộc stdin sử dụng quét.

cat('Solution to everything? > ') 
b <- scan("stdin", character(), n=1) 

Ví dụ:

$ Rscript t.R 
Solution to everything? > 42 
Read 1 item 
+0

Tuyệt vời! Điều này gần như giải quyết [vấn đề của tôi] (https://stackoverflow.com/questions/47294283/how-to-run-an-r-script-and-show-a-plot). Tuy nhiên nó sẽ được tốt đẹp nếu giao diện điều khiển đã không được chờ đợi cho văn bản + Quay trở lại, nhưng thay vì phản ứng với phím bấm đầu tiên (như trong "Nhấn phím bất kỳ để tiếp tục"). – Vorac

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