Câu trả lời:
Như ai đó đã viết trong một bình luận, bạn không cần phải sử dụng con 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ó cho một biến và không muốn trả về được in trong bảng điều khiển, hãy bọc nó readline()
trong invisible()
:
invisible(readline(prompt="Press [enter] to continue"))
press esc keep to exit loop
?
Phương pháp 1
Chờ cho đến khi bạn nhấn [enter] trong bảng điều khiển:
cat ("Press [enter] to continue")
line <- readline()
Gói thành một chức năng:
readkey <- function()
{
cat ("Press [enter] to continue")
line <- readline()
}
Hàm này tương đương tốt nhất Console.ReadKey()
trong C #.
Cách 2
Tạm dừng cho đến khi bạn gõ phím [enter] 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ì đó không phải là số, nó sẽ hiển thị một lỗi.
print ("Press [enter] to continue")
number <- scan(n=1)
Gói thành 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ờ nhấn phím trước khi vẽ một điểm khác trên biểu đồ. Trong trường hợp này, chúng ta có thể sử dụng getGraphicsEvent () để chờ nhấn phím trong biểu đồ.
Chương trình mẫu này minh họa 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]")
}
Tại đây bạn có thể thấy biểu đồ, với một nửa số điểm của nó được tô màu, chờ nhấn phím tiếp theo trên bàn phím.
Khả năng tương thích: Được kiểm tra trong các môi trường sử dụng win.graph hoặc X11 . Hoạt động với Windows 7 x64 với Revolution R v6.1. Không hoạt động theo RStudio (vì nó không sử dụng win.graph).
prompt
đối số để readline
. Phương pháp 2 sẽ hoạt động với mọi đầu vào (không chỉ số) nếu what=""
được thêm vào lệnh gọi đến 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 những thiết bị đó thì nó hoạt động tốt).
if(line == "Q") stop()
Đây là một chức năng nhỏ (sử dụng gói tcltk) sẽ mở một cửa sổ nhỏ và đợi cho đến khi bạn nhấp vào nút tiếp tục hoặc nhấn bất kỳ phím nào (trong khi cửa sổ nhỏ vẫn có tiêu điểm), sau đó nó sẽ để tập lệnh 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()
tập lệnh của bạn bất cứ nơi nào bạn muốn tập lệnh tạm dừng.
Điều 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ả những nền tảng phổ biến), sẽ phản hồi vớ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 nó 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ẽ đợi mãi). Có thể thêm đồng hồ bấm giờ để tiếp tục sau một khoảng thời gian đã đặt nếu không nhấp hoặc nhấn phím.
Nó không trả về phím nào được nhấn (nhưng có thể được sửa đổi để làm như vậy).
Error in structure(.External(.C_dotTclObjv, objv), class = "tclObj") : [tcl] invalid command name "toplevel".
)
Cả R và Rupcript đều gửi ''
đến đường đọc và quét ở chế độ không tương tác (xem ? readline
). Giải pháp là bắt buộc stdin
sử dụng quét.
cat('Solution to everything? > ')
b <- scan("stdin", character(), n=1)
Thí dụ:
$ Rscript t.R
Solution to everything? > 42
Read 1 item
Câu trả lời này tương tự như của Simon , nhưng không yêu cầu thêm đầu vào ngoài dòng mới.
cat("Press Enter to continue...")
invisible(scan("stdin", character(), nlines = 1, quiet = TRUE))
Sử dụng nlines=1
thay vì n=1
, người dùng chỉ cần nhấn enter để tiếp tục Rupcript.
Rscript
: nó tạm dừng và chỉ yêu cầu nhấn Enter
để tiếp tục.
Một cách để làm điều đó (loại, bạn phải nhấn một nút chứ không phải là một phím, nhưng đủ gần) là sử dụng sáng bóng:
library(shiny)
ui <- fluidPage(actionButton("button", "Press the button"))
server <- function(input, output) {observeEvent(input$button, {stopApp()})}
runApp(shinyApp(ui = ui, server = server))
print("He waited for you to press the button in order to print this")
Theo kinh nghiệm của tôi, điều này có một đặc điểm độc đáo: ngay cả khi bạn chạy tập lệnh có mã được viết theo runApp
chức năng, nó sẽ không chạy cho đến khi bạn nhấn nút trong ứng dụng (nút dừng ứng dụng từ bên trong sử dụng stopApp
).