将日志重新定义为通用时无法修复警告

时间:2017-03-23 20:16:57

标签: r generics methods

我想使Ctrl+Shift+Enter函数成为通用函数,以便我可以在某些log下改变它的行为。

我有一个带有描述文件的最小包:

newclass

R代码,基于我在Writing R ExtensionsIs it bad style to redefine non-S3 base functions as S3 functions in an R package?

学到的知识
Package: logmethod
Type: Package
Title: A new Log Method
Version: 0.1
Date: 2017-03-23
Author: Me
Maintainer: Who to complain to <yourfault@somewhere.net>
Description: More about what it does (maybe more than one line)
License: MIT
LazyData: TRUE
RoxygenNote: 5.0.1

当我运行#' @name log_method #' @title A New Log Method #' #' @description A new \code{log} method #' #' @param x a numeric, complex, or measured variable #' @param base a positive or complex measured variable: the base with respect to which #' logarithms are computed. Defaults to \emph{e}=\code{exp(1)}. #' @param ... Additional arguments to pass to other methods. #' #' @export log <- function(x, base, ...) { UseMethod("log") } #' @rdname log_method #' @export log.default <- function(x, base, ...) { base::log(x, base) } #' @rdname log_method #' @export log.newclass <- function(x, base, ...) { print("See, it dispatched") log.default(as.numeric(x), as.numeric(base), ...) } 时,我会继续收到警告

  
      
  • 检查S3通用/方法一致性......警告   警告:未找到声明的S3方法'log.default'   警告:未找到声明的S3方法'log.newclass'   请参阅'写作R'中的“通用函数和方法”部分   扩展手册。
  •   

当我安装软件包时,我可以使用checklog.default,所以我不确定如何解释这个警告,找不到方法。 Turning an R S3 ordinary function into a generic描述了如何制作S4功能,但如果可能,我想坚持使用S3。我很想知道为什么我一直收到这个警告。

编辑:

NAMESPACE也可能有用。

log.newclass

1 个答案:

答案 0 :(得分:1)

事实证明,我所缺少的那块拼图是log,而且它的大多数表兄弟已经已经泛型。来自?log文档详细信息

  

除logb之外的所有内容都是通用函数:可以为它们定义方法   单独或通过数学小组通用。

因此,对新方法的正确编码将如下(注意缺少UseMethod调用)

log.default <- function(x, base, ...)
{
  base::log(x, base)
}

log.newclass <- function(x, base, ...)
{
  print("See, it dispatched")
  log.default(as.numeric(x), as.numeric(base), ...)
}

另一方面,由于logb未被定义为泛型,因此编写R扩展中的指令与之相关(因为尚未设计调度)

logb <- function(x, base, ...)
{
  UseMethod("logb")
}

logb.default <- function(x, base, ...)
{
  base::logb(x, base)
}

logb.newclass <- function(x, base, ...)
{
  print("See, it dispatched")
  logb.default(as.numeric(x), as.numeric(base), ...)
}

因此,如果您遇到类似问题的警告,则可能需要检查函数的base版本是否已经是通用的。