使用键盘输入 (R) 打破循环
Break loop with keyboard input (R)
我需要一个 R 循环来继续 运行ning 直到用户按下一个键。像下面这样的东西。有任何想法吗?我是 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.c
为 R
编译它。
最后,在R
中,加载新创建的kbhit.so
,写一个函数(kbhit
),returns从C
函数输出,然后 运行 你的循环。 kbhit()
returns 0 除非它收到回车键。请注意,停止循环的唯一方法是点击 enter/return(或硬中断)——如果您想要更灵活的方法,请参阅上面的 link。
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)
}
P.s。我通过谷歌搜索一起破解了这个,所以不幸的是我不知道它是如何或为什么起作用的(如果它对你有用的话!)。
我需要一个 R 循环来继续 运行ning 直到用户按下一个键。像下面这样的东西。有任何想法吗?我是 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.c
为 R
编译它。
最后,在R
中,加载新创建的kbhit.so
,写一个函数(kbhit
),returns从C
函数输出,然后 运行 你的循环。 kbhit()
returns 0 除非它收到回车键。请注意,停止循环的唯一方法是点击 enter/return(或硬中断)——如果您想要更灵活的方法,请参阅上面的 link。
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)
}
P.s。我通过谷歌搜索一起破解了这个,所以不幸的是我不知道它是如何或为什么起作用的(如果它对你有用的话!)。