R:了解R中的“.call”函数

问题描述 投票:0回答:1

我正在使用 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 algorithm github optimization
1个回答
0
投票

您是正确的,在您使用的 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 的开发者。]

这是在安装包时编译的,因此需要正确安装包才能工作。

为了避免错误,您应该安装软件包而不是手动复制代码。如果您由于系统老化而在安装软件包时遇到问题,这里有一些建议:

  1. 安装预编译的二进制文件

    有时,CRAN 为旧系统提供预编译的二进制文件。这允许您安装包而无需自己编译 C/C++ 代码。您可以尝试使用:

    install.packages("mco", type = "binary")
    

    在较旧的系统上,该软件包可能仍可作为来自 CRAN 或存档版本的二进制文件使用。

  2. 从 GitHub 安装:

    如果 CRAN 安装失败,您可以尝试使用

    devtools
    直接从 GitHub 存储库安装软件包:

    devtools::install_github("olafmersmann/mco")
    

    如果您的 R 版本不受 CRAN 支持,但可以处理来自 GitHub 的包,这可能会解决问题。

  3. 使用旧版本的 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")
    
© www.soinside.com 2019 - 2024. All rights reserved.