我想使Ctrl+Shift+Enter
函数成为通用函数,以便我可以在某些log
下改变它的行为。
我有一个带有描述文件的最小包:
newclass
R代码,基于我在Writing R Extensions和Is 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'中的“通用函数和方法”部分 扩展手册。
当我安装软件包时,我可以使用check
和log.default
,所以我不确定如何解释这个警告,找不到方法。 Turning an R S3 ordinary function into a generic描述了如何制作S4功能,但如果可能,我想坚持使用S3。我很想知道为什么我一直收到这个警告。
编辑:
NAMESPACE也可能有用。
log.newclass
答案 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
版本是否已经是通用的。