我正在使用 R。我正在使用一个名为“mco”的库:https://cran.r-project.org/web/packages/mco/index.html
我在 github 存储库中查看了该库中使用的一些函数定义,例如:https://github.com/olafmersmann/mco/blob/master/R/nsga2.R
在这里,我遇到了以下几行代码:
res <- .Call(do_nsga2,
ff, cf, sys.frame(),
as.integer(odim),
as.integer(cdim),
as.integer(idim),
lower.bounds, upper.bounds,
as.integer(popsize), as.integer(generations),
cprob, as.integer(cdist),
mprob, as.integer(mdist))
if (1 == length(res)) {
res <- res[[1]]
names(res) <- c("par", "value", "pareto.optimal")
class(res) <- c("nsga2", "mco")
} else {
for (i in 1:length(res)) {
names(res[[i]]) <- c("par", "value", "pareto.optimal")
class(res[[i]]) <- c("nsga2", "mco")
}
class(res) <- "nsga2.collection"
}
return (res)
}
在这段代码的第一行,它引用了一些名为“do_nsga2”的对象。但除了这个函数之外,我在整个包中找不到任何对“do_nsga2”的引用。
有谁知道“所谓”到底是什么?
谢谢
注意:我正在尝试将 github 存储库中的所有函数复制/粘贴到我的 R 会话中,因为我使用的是一台旧计算机,无法直接从 CRAN 安装库。当我尝试复制/粘贴所有这些函数时,出现以下错误:
Error in nsga2....
object 'do_nsga2' not found
您是正确的,在您使用的 R 源文件中找不到
do_nsga2
。 .Call
函数用于调用已编译的C或C++代码,do_nsga2
在mco
包的编译部分中定义,特别是在C代码中。 .Call
函数将 R 连接到这些较低级别、执行速度更快的例程。
由于
do_nsga2
是编译代码,因此它不会出现在您正在复制的 R 代码中。相反,它位于包的 src/
目录中,其中存储了 C 源代码。您可以在 GitHub 存储库上检查此代码是否有 mco
。具体来说,您可以在src/nsga2.c
中找到它,它实现了核心算法。这是 C 函数签名:
SEXP do_nsga2(SEXP s_function,
SEXP s_constraint,
SEXP s_env,
SEXP s_obj_dim,
SEXP s_constr_dim,
SEXP s_input_dim,
SEXP s_lower_bound,
SEXP s_upper_bound,
SEXP s_popsize,
SEXP s_generations,
SEXP s_crossing_prob,
SEXP s_crossing_dist,
SEXP s_mutation_prob,
SEXP s_mutation_dist) {
[旁注:我曾经认为
SEXP
与R在S和S-Plus中的起源有关,但显然,SEXP
代表符号表达,它来自Lisp,特别是它的方言Scheme,这显然启发了R 的开发者。]
这是在安装包时编译的,因此需要正确安装包才能工作。
为了避免错误,您应该安装软件包而不是手动复制代码。如果您由于系统老化而在安装软件包时遇到问题,这里有一些建议:
安装预编译的二进制文件:
有时,CRAN 为旧系统提供预编译的二进制文件。这允许您安装包而无需自己编译 C/C++ 代码。您可以尝试使用:
install.packages("mco", type = "binary")
在较旧的系统上,该软件包可能仍可作为来自 CRAN 或存档版本的二进制文件使用。
从 GitHub 安装:
如果 CRAN 安装失败,您可以尝试使用
devtools
直接从 GitHub 存储库安装软件包:
devtools::install_github("olafmersmann/mco")
如果您的 R 版本不受 CRAN 支持,但可以处理来自 GitHub 的包,这可能会解决问题。
使用旧版本的 R/Packages:
您可以下载并安装与您的计算机兼容的旧版本 R 以及旧版本的
mco
软件包。 CRAN 保留软件包的存档版本。您可以安装适合您的设置的特定版本。为此,首先从 the CRAN archive 找到您需要的版本,然后使用 remotes::install_version()
函数安装特定版本的软件包,例如:
remotes::install_version("mco", version = "1.0-15", repos = "http://cran.r-project.org")
最后,您可以从 CRAN 存档下载所需版本的 tarball,然后在本地安装。首先,从 CRAN 存档下载软件包 tarball,然后使用以下命令安装:
install.packages("/path/to/downloaded/mco_1.0-15.tar.gz", repos = NULL, type = "source")