在R中,是否可以将信号从控制台发送到正在运行的功能,以便该功能可以执行某些操作?例如,退出并返回当前值?
这是一个示例:下面的函数引导回归系数的标准误差。函数的详细程度显示了方差如何演变。它将逐渐接近其下限。我希望能够发送INTERUPTION SIGNAL
(以某种方式),该代码将停止while循环并导致函数完全退出。
example <- function(y, x){
bvec <- c()
while(TRUE){
s <- sample(1:1000, replace = T)
b <- lm(y[s]~x[s])$coef[2]
bvec <- append(bvec, b)
Sys.sleep(.1)
print(var(bvec))
if(INTERUPTION_SIGNAL){
return(var(bvec))
}
}
}
x <- rnorm(1000)
y <- x+rnorm(1000)
在虚拟示例中,我可以在全局环境下运行。在实际情况下,这是不切实际的。每次迭代之后也可以写入磁盘,但这会很慢。我想我可以在详细程度上方添加以下行:
tempout <<- var(bvec)
,可以通过将输出置于global来工作。但这感觉有点笨拙,都依赖于^C
,我不想使用。 最佳答案
使用keypress
包:
library(keypress)
x=0
while(TRUE){
x = x + 1
k = keypress(block=FALSE)
if(k!="none")break
}
按任意键即可突破。在大约49000次迭代后,我按了“a”:
> k
[1] "a"
> x
[1] 49263
例如,如果要在按“Q”时中断,或者在按“S”时打印状态,则可以检查特定的键。
该文档似乎暗示它应该返回NA而不是“none”,但是我可能会误读它。