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

사용자가 키를 누를 때까지 R 스크립트를 일시 중지하고 싶습니다.

어떻게해야합니까?



답변

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

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

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

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


답변

방법 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를 사용하지 않으므로).

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


답변

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

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


답변

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


답변

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

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

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


답변

그것을하는 방법 (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.


답변