R에서 키 누르기를 기다리는 방법?


답변:


127

누군가 이미 의견을 작성 했으므로 이전에 고양이를 사용할 필요는 없습니다 readline(). 간단히 쓰십시오 :

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

당신이 변수에 할당하지 않고 콘솔에 인쇄 복귀를 원하지 않는 경우, 포장 readline()의를 invisible():

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

이것이 가장 좋은 대답이라고 생각합니다.
Léo Léopold Hertz 준영

1
기능을 하나 더 추가하는 것은 어떻습니까? press esc keep to exit loop?
I_m_LeMarque

4
@nnn rstudio에서 스크립트를 실행하면 작동하지 않습니다. print ( "hi") readline ( "계속하려면 키를 누르십시오") print ( "ho") 아마도 세션이 대화 형이 아니기 때문일 것입니다. 비 대화식 세션에서이를 수행하는 방법은 무엇입니까?
PascalIv

79

방법 1

콘솔에서 [enter]를 누를 때까지 기다립니다.

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

함수로 감싸기 :

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

이 함수는 Console.ReadKey()C #에서 가장 적합한 기능입니다 .

방법 2

키보드에서 [enter] 키 입력을 입력 할 때까지 일시 중지하십시오. 이 방법의 단점은 숫자가 아닌 것을 입력하면 오류가 표시된다는 것입니다.

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

함수로 감싸기 :

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

방법 3

그래프에서 다른 점을 표시하기 전에 키 누르기를 기다렸다 고 상상해보십시오. 이 경우 getGraphicsEvent ()를 사용하여 그래프 내에서 키 누르기를 기다릴 수 있습니다.

이 샘플 프로그램은 개념을 보여줍니다.

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

여기에서 점의 절반이 색상으로 표시된 그래프를 볼 수 있으며 키보드에서 다음 키 입력을 기다립니다.

호환성 : 환경에서 테스트 한 결과 win.graph 또는 X11이 사용됩니다 . Revolution R v6.1이 설치된 Windows 7 x64에서 작동합니다. RStudio에서는 작동하지 않습니다 (win.graph를 사용하지 않으므로).

여기에 이미지 설명을 입력하십시오


6
prompt인수를 사용하여 방법 1을 단축 할 수 있습니다 readline. 방법 2는 what=""에 대한 호출에 추가 된 경우 숫자뿐만 아니라 모든 입력에서 작동 합니다 scan. getGraphicsEvent특정 플랫폼의 특정 그래픽 장치에서만 작동합니다 (그러나 해당 장치 중 하나를 사용하는 경우 제대로 작동합니다).
Greg Snow

2
루프에서이 기능 (방법 1)을 사용하고 루프를 중지하려면 다음을 포함하십시오.if(line == "Q") stop()
Dorian Grv

18

작은 창을 열고 계속 버튼을 클릭하거나 아무 키나 누를 때까지 기다리는 작은 기능 (tcltk 패키지 사용)이 있습니다 (작은 창에 여전히 초점이있는 동안), 그러면 스크립트가 계속됩니다.

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

mywait()스크립트를 일시 중지하려는 곳이면 어디든지 스크립트를 넣으 십시오.

이것은 tcltk를 지원하는 모든 플랫폼에서 작동합니다 (모든 공통적 인 것으로 생각합니다) (입력뿐만 아니라) 키 누르기에 응답하고 스크립트가 배치 모드에서 실행될 때도 작동하지만 배치 모드에서 여전히 일시 중지됩니다 따라서 계속하지 않으면 영원히 기다릴 것입니다). 클릭하지 않았거나 키를 눌렀을 경우 일정 시간이 지난 후에 타이머를 추가하여 계속 사용할 수 있습니다.

어떤 키를 눌렀는지는 반환하지 않지만 수정하려면 수정할 수 있습니다.


그것은 굉장. 그러나 어떤 이유로 든 경고는 RStudio-Server 웹 클라이언트에서 실행되지 않습니다. ( Error in structure(.External(.C_dotTclObjv, objv), class = "tclObj") : [tcl] invalid command name "toplevel". )
milia

2
@milia, 맞습니다. tcltk 기반 코드는 로컬 시스템에서 실행해야하며 RStudio-Server에서 실행되지 않습니다.
Greg Snow

14

R 및 Rscript는 모두 ''비 대화식 모드에서 readline으로 전송 하고 스캔합니다 (참조 ? readline). 해결책은 stdin스캔 을 사용하여 강제 하는 것입니다.

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

예:

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

2
대박! 이것은 거의 내 문제를 해결 합니다. 콘솔이 텍스트 + 리턴을 기다리지 않고 "계속하려면 아무 키나 누르십시오"와 같이 첫 번째 키 누르기에 반응 한 경우에도 좋을 것입니다.
Vorac

3

이 답변은 Simon 의 답변과 비슷 하지만 줄 바꿈 이외의 추가 입력이 필요하지 않습니다.

cat("Press Enter to continue...")
invisible(scan("stdin", character(), nlines = 1, quiet = TRUE))

nlines=1대신을 사용 n=1하면 Enter 키를 눌러 Rscript를 계속할 수 있습니다.


+1 이것은 실제로 원하는대로 작동하는 유일한 답변입니다. 내부 Rscript: 일시 정지되며 Enter계속 하기 만하면 됩니다.
arielf

2
이것은 R을 깨고 나는 세션을 종료해야했다
blobbymatt

1
대화식 모드에서는 R이 중단되고 세션을 종료해야합니다. 항목에 경고를 추가하십시오.이 경우 다운 보트를 제거하겠습니다.
HoneyBuddha

Windows에서 예상대로 나를 위해 일했습니다!. 수락 된 솔루션 (위)을 건너 뛰고 일시 중지하지 않았습니다. 이것은 실제로 잠시 멈추고 엔터를 누르기를 기다렸습니다.
Matt D

0

그것을하는 방법 (kinda, 키 대신 버튼을 눌러야하지만 충분히 가깝습니다)은 반짝이는 것을 사용하는 것입니다.

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

내 경험에 따르면 이것은 고유 한 특징이 있습니다. runApp함수에 따라 작성된 코드가있는 스크립트를 실행하더라도 앱의 버튼 (을 사용하여 앱이 내부에서 중지되는 버튼)을 누를 때까지 실행되지 않습니다 stopApp.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.