Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于长参数组合的S4方法调度 动机_R_Generics_Methods_S4 - Fatal编程技术网

R 基于长参数组合的S4方法调度 动机

R 基于长参数组合的S4方法调度 动机,r,generics,methods,s4,R,Generics,Methods,S4,我试图创建一个通用的R函数,它不依赖于主参数(n)的签名,而是依赖于辅助参数的存在来分派方法 我不确定这在S3中是否可行,但我知道如何在S4中实现这一点(尽管你可能会注意到,这是一种草率的方式)。不知道R5或S6 MRE setGeneric( name=“genfunk”, def=功能(n、a、b、c、d)标准通用(“genfunk”), 签名=c(“a”、“b”、“c”、“d”) ) 设置方法( f=“genfunk”, 签名=列表( a=“数字”, b=“数字”, c=“失踪”, d=“

我试图创建一个通用的R函数,它不依赖于主参数(
n
)的签名,而是依赖于辅助参数的存在来分派方法

我不确定这在S3中是否可行,但我知道如何在S4中实现这一点(尽管你可能会注意到,这是一种草率的方式)。不知道R5或S6

MRE
setGeneric(
name=“genfunk”,
def=功能(n、a、b、c、d)标准通用(“genfunk”),
签名=c(“a”、“b”、“c”、“d”)
)
设置方法(
f=“genfunk”,
签名=列表(
a=“数字”,
b=“数字”,
c=“失踪”,
d=“缺失”
),
定义=函数(n,a,b)n+a+b
)
设置方法(
f=“genfunk”,
签名=列表(
a=“失踪”,
b=“失踪”,
c=“数字”,
d=“数字”
),
定义=函数(n,c,d)n*c*d
)
这使我能够调用函数并获得如下内容:

r$>genfunk(10,a=1,b=2)
[1] 13
r$>genfunk(10,c=3,d=2)
[1] 60
问题 问题是,混合调用会给用户带来“胡说八道”:

r$>genfunk(10,a=1,c=2)
(函数(类、fdef、mtable)中出错:
找不到签名“numeric”、“missing”、“numeric”、“missing”的函数“genfunk”的继承方法
问题
  • 是否可以创建一个“异常”签名来处理所有这些不正确的参数不匹配
  • 是否可以重命名有效签名,以便在文档中正确标记它们?在我的真实案例中,
    genfunk
    的文档包含以下内容:
  • 签名的方法 ##'数字,数字,缺失,缺失' genfunk(n、a、b) ##S4签名方法 ##'缺少,缺少,数字,数字' 根芬克(北、中、东) 这对用户来说毫无意义,除非他们查看泛型的代码。在我的实际代码中,情况更糟,因为签名列表当前包含来自十几个不同方法(和计数)的近二十个参数

    我认为技巧应该在文档中的某个地方,但我觉得我已经没有东西可以尝试了。目前,通用的文档记录为:

    #'@title是的,title!
    #“@param n Enn
    #“@出口
    
    每种方法都记录为:

    #@title AB funk
    #“@param a Ehi!
    #“@param b Bee
    #“@rdname genfunk
    
    抱歉,这不是S4,但从您提问的方式来看,我相信您可能也对可能的S3解决方案感到好奇。如果我理解正确,您希望基于特定命名参数组合的存在来分派方法。我认为没有办法为您选择的每个组合手动定义方法希望允许,然后为其余部分创建一个“默认方法”。基于S3中的参数进行调度的一种方法是:

    genfunk错误:参数的奇怪组合
    

    (v0.3.0)于2021-02-03年创建,简而言之,-您想为每个参数组合提供方法吗?@tjebo,差不多。我想为一些(相互排斥的)参数组合提供方法,并可能为其他组合提供伞式方法(只是为了向用户提供一些关于如何使用泛型的有用反馈)。你看过
    dotsMethods
    的帮助页面了吗?你的函数可以用
    ..
    作为参数来代替命名参数吗?@JDL,谢谢你指出这一点,我不知道这有一个文档页面。如果我有进展,我会尝试一下,然后回到这里。谢谢你的贡献!我真的不在乎哪一个我最终使用的对象系统。你在泛型中定义类的想法听起来很有希望,我来试一试。