gpt4 book ai didi

r - 使用键盘输入中断循环 (R)

转载 作者:行者123 更新时间:2023-12-01 03:29:53 24 4
gpt4 key购买 nike

我需要一个 R 循环来继续运行,直到用户按下某个键。像下面这样的东西。有任何想法吗?我是 R 新手

while(FALSE_after_user_input){
queryWebApi()
Sys.sleep(1)
}

编辑 1

我真正想要的是一种停止数据收集的方法。我有一个函数,我想每隔几秒运行一次来​​查询新数据。用户需要能够停止数据收集循环。

readline() 不起作用,因为它停止执行数据收集循环

最佳答案

建议1: TCL/TK

library(tcltk)
win1 <- tktoplevel()
butStop <- tkbutton(win1, text = "Stop",
command = function() {
assign("stoploop", TRUE, envir=.GlobalEnv)
tkdestroy(win1)
})
tkgrid(butStop)

stoploop <- FALSE
while(!stoploop) {
cat(". ")
Sys.sleep(1)
}
cat("\n")

一些代码借用自: A button that triggers a function call .

建议2:对标准输入进行非阻塞检查。 (请注意: C不是我的核心能力,这是我从网上的一些东西拼凑出来的。)主要想法是在 C中写一个函数。等待用户输入,并从 R 调用它.

下面的片段改编自 Non-blocking user input in loop .将以下代码另存为 kbhit.c :
#include <stdio.h>
#include <unistd.h>
#include <R.h>

void kbhit(int *result)
{
struct timeval tv;
fd_set fds;
tv.tv_sec = 0;
tv.tv_usec = 0;
FD_ZERO(&fds);
FD_SET(STDIN_FILENO, &fds); //STDIN_FILENO is 0
select(STDIN_FILENO+1, &fds, NULL, NULL, &tv);
*result = FD_ISSET(STDIN_FILENO, &fds);
}

然后,从命令行运行 R CMD SHLIB kbhit.cR 编译它.

最后,在 R ,加载新创建的 kbhit.so , 编写一个函数 ( kbhit ) 返回 C 的输出函数,然后运行你的循环。 kbhit()除非收到回车键,否则返回 0。请注意,停止循环的唯一方法是按 Enter/return(或硬中断)——如果您想要更灵活的方法,请参阅上面的链接。
dyn.load("kbhit.so")

kbhit <- function() {
ch <- .C("kbhit", result=as.integer(0))
return(ch$result)
}

cat("Hit <enter> to stop\n")
while(kbhit()==0) {
cat(". ")
Sys.sleep(1)
}

More details on the .C interface to R .

在 Windows 机器上:

kbhit.c
#include <stdio.h>
#include <conio.h>
#include <R.h>

void do_kbhit(int *result) {
*result = kbhit();
}

R :
dyn.load("kbhit.dll")

kbhit <- function() {
ch <- .C("do_kbhit", result=as.integer(0))
return(ch$result)
}

cat("Hit any key to stop\n")
while(kbhit()==0) {
cat(". ")
Sys.sleep(1)
}

附言我通过谷歌搜索一起破解了它,所以不幸的是我不知道它是如何或为什么起作用的(如果它对你有用!)。

关于r - 使用键盘输入中断循环 (R),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38755283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com