检测r内窗口中运行的r实例的数量

Luc*_*ini 3 r

我有一个我正在创建的r代码,我想检测Windows中R的运行实例的数量,以便脚本可以选择是否运行特定的脚本集(即,如果已经有> 2个R的实例运行X,否则Y).

在R中有没有办法做到这一点?

编辑:这里有一些关于目的的信息:我有一套很长的脚本,用于在成千上万的情况下使用catnet库应用贝叶斯网络模型.此代码处理并输出每个案例的csv文件中的结果.我尝试过的大多数并行计算方案并不理想,因为它们抑制了许多内置的进度通知,因此我在R的不同实例上运行了一部分案例.我知道这有些过时,但它适用于我,所以我想要一种方法,根据运行的实例数自动使代码子集的数量.我现在手动通过在CMD中打开Rscript的多个实例来打开稍微不同配置的r文件来得到这样的东西: 在此输入图像描述

cd "Y:\code\BN_code"
START "" "C:\Program Files\R\R-3.0.0\bin\x64\Rscript.exe" "process spp data3.r" /b
START "" "C:\Program Files\R\R-3.0.0\bin\x64\Rscript.exe" "process spp data3_T1.r" /b
START "" "C:\Program Files\R\R-3.0.0\bin\x64\Rscript.exe" "process spp data3_T2.r" /b
START "" "C:\Program Files\R\R-3.0.0\bin\x64\Rscript.exe" "process spp data3_T3.r" /b
Run Code Online (Sandbox Code Playgroud)

EDIT2:

感谢下面的答案,这里是我在R中实现的'穷人的并行计算:所以如果你有任何长脚本必须应用于一长串案例列表,请使用下面的代码将长列表分成一个要提供给每个rscript实例的子列表数量:

#the cases that I need to apply my code to:
splist=c("sp01", "sp02", "sp03", "sp04", "sp05", "sp06", "sp07", "sp08", "sp09", "sp010", "sp11", "sp12", 
         "sp013", "sp014", "sp015", "sp16", "sp17", "sp018", "sp19", "sp20", "sp21", "sp22", "sp23", "sp24")
###automatic subsetting of cases based on number of running instances of r script:
cpucores=as.integer(Sys.getenv('NUMBER_OF_PROCESSORS'))
n_instances=length(system('tasklist /FI "IMAGENAME eq Rscript.exe" ', intern = TRUE))-3
jnk=length(system('tasklist /FI "IMAGENAME eq rstudio.exe" ', intern = TRUE))-3
if (jnk>0)rstudiorun=TRUE else rstudiorun=FALSE 

if (!rstudiorun & n_instances>0 & cpucores>1){ #if code is being run from rscript and 
#not from rstudio and there is more than one core available
  jnkn=length(splist)
  jnk=seq(1,jnkn,round(jnkn/cpucores,0))
  jnk=c(jnk,jnkn)
  splist=splist[jnk[n_instances]:jnk[n_instances+1]]
}
###end automatic subsetting of cases

#perform your script on subset of list of cases:
for(sp in splist){
  ptm0 <- proc.time()
  Sys.sleep(6)  
  ptm1=proc.time() - ptm0
  jnk=as.numeric(ptm1[3])
  cat('\n','It took ', jnk, "seconds to do species", sp)
}
Run Code Online (Sandbox Code Playgroud)

要使此代码在Windows中自动在r的多个实例上运行,只需创建一个.bat文件:

cd "C:\Users\lfortini\code\misc code\misc r code"
START "" "C:\Program Files\R\R-3.0.0\bin\x64\Rscript.exe" "rscript_multiple_instances.r" /b
timeout 10
START "" "C:\Program Files\R\R-3.0.0\bin\x64\Rscript.exe" "rscript_multiple_instances.r" /b
timeout 10
START "" "C:\Program Files\R\R-3.0.0\bin\x64\Rscript.exe" "rscript_multiple_instances.r" /b
timeout 10
START "" "C:\Program Files\R\R-3.0.0\bin\x64\Rscript.exe" "rscript_multiple_instances.r" /b
exit
Run Code Online (Sandbox Code Playgroud)

超时是为r提供足够的时间来检测自己的实例数.单击此.bat文件将自动打开r脚本的大量实例,每个实例都会处理您要分析的案例的特定子集,同时仍然提供每个窗口中脚本运行的所有进度,如上面的图片.关于这种方法的一个很酷的事情是,在你在代码中使用的迭代机制(循环,应用fx等)之前,你几乎不得不对自动列表子集化代码进行打击.然后使用.bat或手动使用rcript激活代码并设置.

Hen*_*rik 8

实际上它比预期更容易,因为Windows带有这里tasklist发现的很好的功能.

有了它,您可以获得所有正在运行的进程,您只需要计算Rscript.exe实例数(我stringr在这里用于字符串操作).

require(stringr)
progs <- system("tasklist", intern = TRUE)
progs <- vapply(str_split(progs, "[[:space:]]"), "[[", "", i = 1)
sum(progs == "Rscript.exe")
Run Code Online (Sandbox Code Playgroud)

这应该够了吧.(我只尝试计算实例,Rgui.exe但工作正常.)