2011-03-31 7 views
3

나는 스크립트가 있는데 키보드 입력으로 시작한 다음이 변수에 입력 된 값을 기반으로 작업을 계속하려고하지만 y=readline("please enter a value")을 시도했지만 스크립트 값 입력을 기다리지 않고 그냥이 문장을 표시하고 계속 진행하십시오. 어떻게 할 수 있습니까 ??? 감사합니다. ?? -이 경우 모드 캐릭터의 벡터키보드에서 값이 입력 될 때까지 스크립트를 중지 할 때

print("please enter a value") 
y <- scan(file = "", what = "", nmax = 1) 

scan() 입력하는 사용자에 대한 대기 및 텍스트가 y에 저장됩니다 :

+0

스크립트를 어떻게 실행하고 있습니까? 'readline()'은 대화식으로 만 사용될 수 있습니다. 재생산 가능한 예제가 도움이 될 것입니다. –

+0

@Gavin Simpson : 윈도우에서 스크립트를 실행 중입니다 (cmd로 실행 됨). thmx – weblover

답변

2

당신은 아마 scan(), 같은 것을 원한다.

+0

@mdsumner : 안녕하세요, 작동하지 않습니다. readline과 동일하게 작동합니다. 문장을 인쇄합니다. 그리고 나서 그것을 쓰고 (0 행을 읽는다) 스크립트는 계속 실행한다. btw 나는 윈도우에서 스크립트를 실행하고있다. cmd를 두번 클릭하면된다. (cmd로 실행된다.) thnx – weblover

+0

Gavin Simpson이 원본과 함께 제공했다. 질문, 당신이하고있는 것에 대한 완전한 설명, 당신이 그것을하기 위해 무엇을 사용하고 있는지, 경험할 것으로 예상되는 것, 그리고 실제로 경험 한 것이 도움이 될 것입니다. 이것은 R 콘솔에 입력 된 것과 같이 대화식으로 사용되는 R 코드입니다. 코드가 파일의 source() d 인 경우에도 작동합니다. – mdsumner

+0

@abd 말했듯이'readline()'은 대화식 세션에서만 사용할 수 있습니다. 비대륙 형 쉘 세션에서 이것을 실행하고 있습니다. 그러므로 ** ** 작동하지 않을 것입니다. 나는 나의 이전 코멘트에서 이것을 말했다! –

6

매우 간단한 #! 스크립트는 foo()이라는 함수를 만듭니다.이 스크립트의 유일한 목적은 해당 인수 인 'bar'을 반향 출력하는 것입니다.

#! /home/gavin/R/2.13-patched/build/bin/Rscript --vanilla 
foo <- function(bar) { 
    writeLines(paste("You supplied the following information:", bar)) 
} 

## grab command arguments passed as -args 
args <- commandArgs(TRUE) 

## run foo 
foo(args) 

우리는 commandArgs() 기능을 사용하여 쉘 스크립트에 전달 된 모든 명령 줄 인수를 잡고, 다음 스크립트의 마지막 줄에 foo()에게 전달합니다.

foobar.R 파일에 해당 코드 비트가있는 경우 인수를 전달하고 Rscript 인터페이스를 사용하여 스크립트를 실행할 수 있습니다. 위의 실행 파일을 만들어야합니다 (chmod). 다음과 같이

그런 다음 스크립트가 같이 전화를 작동 할 수 있습니다 : 당신이해야 할 수도 있으므로

[[email protected] ~]$ ./foobar.R Cl 
You supplied the following information: Cl 

을하지만 같은 불행하게도 ?Rscript의 정보를주의 할, 표준 Windows cmd를 껍질, 스크립트와 같은 약 #!을 모르는 내가 보여주는 기능을 사용하기 위해 다른 쉘 (Cygwin 쉘이 도움이 될 것을 제안합니다)을 설치하십시오.

업데이트 :source()readline()을 사용하십시오.

대안으로 비 대화식으로 실행하지 않고도 (즉, R GUI를 최소로 실행하고 한 줄의 코드 만 실행하지 않고) 스크립트를 source() 개만 실행하면됩니다. 당신이 할 전체 경로를 지정하지 않는 경우

R> source("barfoo.R") 
What column do you want to work on? Cl 
column was 'Cl' 

또는 예를 들어,이 스크립트 호출 barfoo.R에 있던 다음 R 구이 프롬프트에서 다음

dynamicwilcox <- function() { 
    ANSWER <- readline("What column do you want to work on? ") 
    if(ANSWER=="Ph") { 
     writeLines("column was 'Ph'") 
    } else if(ANSWER=="Cl") { 
     writeLines("column was 'Cl'") 
    } else { 
     writeLines(paste("Sorry, we don't know what to do with column", ANSWER)) 
    } 
    ANSWER ## return something 
} 

dynamicwilcox() 

, 우리는 할 수 이 :

R> source(file.choose()) 

readline()는 대화 형 R 세션에서 사용할 경우 잘 작동 정말 작업에 가장 적합한 도구입니다 -이 그것을 할 막달라 정확히 것입니다.

배치 모드에서 스크립트를 실행하지만 일부 입력을 제공하려는 전제는별로 의미가 없습니다. R은 배치 모드에서 실행될 때 스크립트가 자체 포함될 것으로 기대합니다. 당신은 그것을 깨닫지 못할 수도 있지만 스크립트를 더블 클릭하면 배치 모드로 실행됩니다.

+0

@adb Windows에서이 기능을 사용할 수 있습니까? –

+0

예, 감사합니다. 작동합니다. :) – weblover

0

우분투 (Windows가 아님)에서 동일한 문제가 발생하여 해결책을 찾았습니다.

Rscript 대신 littler (/usr/bin/r)를 사용하고 littler에 대화식 플래그 -i을 전달해야합니다. 내가 스크립트로 실행하면

#!/usr/bin/r -vi 

eprintf <- function(...) cat(sprintf(...), sep='', file=stderr()) 

prompt.read <- function(prompt="\n[hit enter to continue]: ") { 
    eprintf("%s", prompt) 
    invisible(readline()) 
} 

ans <- prompt.read('Please enter a value: ') 
eprintf("You have entered: '%s'\n", ans) 

# rest of script comes here... 

, 내가 얻을 :

$ ./rl.r 
Please enter a value: 42 
You have entered: '42' 

$ ./rl.r 
Please enter a value: Hello to you! 
You have entered: 'Hello to you!' 

이 (우분투)의 littler를 설치하려면 :

이 조합은 스크립트에서 원하는대로 일을 readline()을 설득 관리
sudo apt-get install littler 
관련 문제