将应用功能扩展到S3(与打印或绘图一样)

时间:2018-03-30 16:51:46

标签: r oop apply lapply r-s3

我正在使用R中的pet project构建一个名为groupr的自定义S3类。我已经使用点符号(print.grouprsubset.groupr)编写了一些函数,如Hadley tutorial中所述,但我会喜欢来扩展{{1}功能,但找不到办法。

如教程中所示,apply包提供了一个提示。我看到pryrsubset函数是不同的函数类型,如下所示:

print

此外,> pryr::ftype(subset) [1] "s3" "generic" > pryr::ftype(apply) [1] "function" 功能在终端中打印出来:

subset

但是function (x, ...) UseMethod("subset") <bytecode: 0x115f0ab88> <environment: namespace:base> 函数会打印出它的完整源代码。我相信我明白为什么会发生这种情况 - applyprintsubset等功能是S3功能而plot是一个无聊的旧功能正常函数 - 但我没有看到任何方法扩展apply函数而不“覆盖”基函数。例如,apply在加载包时将函数调用指向我的UseMethod("apply")命名空间。

有谁知道如何解决这个问题?也就是说,groupr函数族不是S3对象,不能使用点表示法扩展。有谁知道如何写applyapply.myclass函数?

1 个答案:

答案 0 :(得分:1)

你大部分都在那里;您需要覆盖原始import java.io.IOException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import de.sample.spring.component.MyComponent; public class Start { private static final Logger LOGGER = LoggerFactory.getLogger(Start.class); private final static String contextPath = "/context/applicationContext.xml"; public static void main(String[] args) throws IOException { ApplicationContext context = null; try { context = new ClassPathXmlApplicationContext(contextPath); } catch (Exception e) { LOGGER.error("",e); } MyComponent myComponent = (MyComponent) context.getBean("myComponent"); myComponent.showWhenExternalCalledMyService(); } } ,但使用将原始调用为默认值的通用函数。因此,您的程序包将具有三个功能:apply,它将是新的通用apply,它将调用apply.default,以及您的新base::apply。加载您的软件包后,您的apply.myclass版本在搜索路径中会更高,因此会被使用。我确定我已经看到过这样做但是现在不能举手示例。

但是,我会怀疑这是否值得;例如,您的用户是否真的会介意apply的版本为groupr?我们都知道apply_groupr在矩阵上使用的是什么以及这个新功能是否足够相似以共享相同的名称?那就是如果我看到apply我会感到困惑,因为apply(my_groupr, 2, mean)不是矩阵吗?