2016-12-18 30 views
2

我希望一次讀入一個字符,並將其轉換爲字符串命令,以便在輸入空格時執行。 我試圖readChar from stdin

con <- file("stdin") 
open(con, blocking=TRUE) 
while(q!=" "){ 
    #q=scan("",what="", nmax=1) 
    q=readChar(con,1) 
    cmd[i]=q;i=i+1 
} 
eval(cmd) 

,但我似乎不明白readChar()正確。

回答

4

有趣的問題,但有一些缺陷:

  • 您使用qcmdi,從不將它們分配,這導致在測試中使用未定義的符號即時錯誤和程序中止或分配
  • 您在while循環的頂部測試q,但從未給出它的值(與之前的點相關)
  • 您在向量中指定的分辨率爲i但從未設置爲1第一
  • 你誤會字符串連接是如何工作的
  • 你誤解了如何從控制檯作品的輸入,這是從根本上通過而不是性格讓你的方法有一個致命的設計問題(和blocking沒有區別)
  • 你終止了錯誤的方式;您的哨點''的值仍被分配。
  • 你打開控制檯,從來沒有關閉它(儘管這可能是確定與stdin
  • 你成長的結果VAR走錯了路,但相對於其他所有問題不要緊這裏

如果我們修的代碼少了,用更好的風格空格,沒有分號和<-進行分配(所有個人/共同喜好),我們得到

con <- file("stdin") 
open(con, blocking=TRUE) 
cmd <- q <- "" 
i <- 1 
while (q != " ") { 
    q <- readChar(con,1) 
    cmd[i] <- q 
    i <- i+1 
} 
print(cmd) # for exposition only 
close(con) 

,並注意最後print而不是eval,我們得到這個(我輸入的命令ls字母后面的空格)

$ Rscript /tmp/marcusloecher.R 
ls 
[1] "l" "s" " " 
$ 

我建議你看看readLines()代替。

現在,我檢查,我明白你也從來沒有接受你問的問題的答案。這是一個有趣的結果,來自我們領域的人有時將自己定義爲所有關於獎勵...

+0

感謝您的答覆,我真的很感謝。爲了我的辯護,(i)我的工作(!)代碼與您的代碼類似,我只是不想用明顯的初始化步驟來混淆我的問題(爲了簡潔起見,我想這個論壇中的任何人都可以運行如果需要的話),(ii)我不接受答案是一種非故意的監督,將來會改變這種情況。 (也就是說,我總共有7個問題,其中5個是有回答的,所以「從不」有點強烈)。我真正的問題確實是你的第五個子彈:我不能以char的形式讀取char,只能讀取行嗎? –

+1

我沒有把你帶到「未回答」問題的任務 - 你對此有限的控制。我帶你去接受「未被接受的」問題 - 七個人中有七人犯了這個錯誤。這只是不好的做法。因此,環顧網站並看到綠色的「勾號」 - 「接受的問題」。 (同樣:列表格式中的「綠色」分數boxen。)這是一個信號*你*預計會給你開始的問題線程的讀者。參見eg [here](http://stackoverflow.com/help/someone-answers)以及[here](http://stackoverflow.com/help/accepted-answer)。 –

+0

我現在很困惑:你的意思是「接受答案」(而不是問題)?到目前爲止,我本來只能做到5次,回想起來已經接受了2個答案,thx讓我注意到了這一點。現在,我希望能夠接受我的問題的答案,即是否可以真正閱讀炭字符,就像我可以在C中輕鬆完成的一樣。 –