r语言 - 使用 RNetlogo 启动 Netlogo 时出错



我已经在Netlogo中构建了一个模拟模型,并希望优化模型参数(大约30个(。由于Netlogo不支持使用不同的参数集自动进行多次运行,因此我正在考虑使用另一个平台(R/python/Java(来调用Netlogo,分析模拟结果并找到最佳参数。

但是,到目前为止,它们都不起作用...在R中,我在使用RNetLogo启动Netlogo时遇到错误。我已经尝试了我能在网上找到的所有潜在解决方案,但仍然没有弄清楚问题所在。如果有人能帮忙,将不胜感激。

法典:

library(RNetLogo)
nl.path = "C:/Program Files/NetLogo 5.3/app"
NLStart(nl.path, gui=FALSE, nl.jarname = 'NetLogo.jar')

错误信息:

java.lang.NoClassDefFoundError: org/nlogo/api/Exceptions$Handler
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
Caused by: java.lang.ClassNotFoundException
at RJavaClassLoader.findClass(RJavaClassLoader.java:383)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 2 more

版本:

- system: Windows 10
- R: 3.3.3
- Netlogo: 5.3/5.3.1/6.0/6.0.2 (tried all of them, same error message)
- Java: 1.8.0_151-b12 (this is the one called in R, checked by .jcall)
- RNetlogo and rJava are most up-to-date as of 1/9/2018

如果您使用 NetLogo 安装中包含的 Java 环境,它能解决您的问题吗?

在 R 中安装或加载 RNetLogo 之前,请尝试以下操作:

Sys.setenv(JAVA_HOME="YOUR-INSTALLATION-PATH\NetLogo 6.0.1\runtime")

我肯定在 5.3.1 中遇到了同样的错误。出于好奇,这适用于 6.0.2 版吗?

library(RNetLogo)
nl.path <- "C:/Program Files/NetLogo 6.0.2/app"
NLStart(nl.path, gui = FALSE, nl.jarname = "netlogo-6.0.2.jar")

有一些诊断程序要运行,但在此之前,将所有.jar文件从Netlogo/文件夹中的Java/文件夹复制到NetLogo 5.3.0.app所在的同一文件夹中。

然后,请确保在目录路径中同时具有/app,在nl.jarname参数中具有NL版本。

# get packages from source
p<-c("rJava", "RNetLogo"); remove.packages(p)
install.packages("rJava", repos = "https://cran.r-project.org/", type="source") 
install.packages("RNetLogo", repos = "https://cran.r-project.org/", type="source")
library(rJava);library(RNetLogo)
nl_path = "C:/Program Files/NetLogo 5.3.0/app" 
ver_nl <- "5.3.0"
NLStart(nl_path,gui=F,nl.jarname = paste0("netlogo-",ver_nl,".jar")) # open netlogo without gui  
# NLLoadModel("path-to-nl-model",nl.obj=NULL) # load model with nl.obj=NULL  

如果失败,请按顺序运行这些诊断程序。你应该没有rJava错误。如果这样做,请确保已安装最新版本的 Java SE:https://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html

# test 1
install.packages("rJava", repos = "https://cran.r-project.org/", type="source"); library(rJava)
.jinit()
.jnew( "java/awt/Point", 10L, 10L )
f <- .jnew("java/awt/Frame","Hello")
.jcall(f,,"setVisible",TRUE)
t1err <- geterrmessage()
# test 2
component <- .jnull()
component <- .jcast(component, new.class = "java/awt/Component")
message <- .jnew("java/lang/String","This is a JOptionPane test from rJava.")
message <- .jcast(message, new.class = "java/lang/Object")
title <- .jnew("java/lang/String","Test")
type <- .jnew("java/lang/Integer", as.integer(2))
f <- .jnew("javax/swing/JOptionPane")
.jcall(f,"showMessageDialog", component, message, title, .jsimplify(type))
t2err <- geterrmessage()
# # test 3
.jcall("java/lang/System", "S", "getProperty", "java.vm.version")
.jcall("java/lang/System", "S", "getProperty", "java.vm.name")
.jcall("java/lang/System", "S", "getProperty", "java.vm.info")
.jcall("java/lang/System", "S", "getProperty", "java.runtime.version")
.jcall("java/lang/System", "S", "getProperty", "sun.arch.data.model")
t3err <- geterrmessage()
# test 4
.jcall("java/lang/System", "S", "getProperty", "java.awt.headless")
Sys.getenv("NOAWT")
t4err <- geterrmessage()
errorlist <- function(){
if(geterrmessage()==t1err){stop("Failed Test 1 — Headless exception n n Wrong awt GUI support for Java/rJava",call.=T)}
if(geterrmessage()==t2err){stop("Failed Test 2 — Invalid method name for RcallMethod (unable to open dialog box)",call.=T)}
if(geterrmessage()==t3err){stop("Failed Test 3 — Old version of Java. n n Download latest version n n > https://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html.",call.=T)}
if(geterrmessage()==t4err){stop("Failed Test 4 — ",call.=T)}
}

最后一种选择是从 JGR 运行 RNetLogo,它在 Mac 的无头模式下工作。

install.packages('JGR',,'http://www.rforge.net/') # note the extra comma 
library(JGR)
JGR::JGR()

最新更新