【问题标题】:R: Distinguish helper functions from main function in CRAN packagesR:区分 CRAN 包中的辅助函数和主函数
【发布时间】:2014-04-25 03:42:39
【问题描述】:

如何区分包含大量函数的包中的辅助函数和主函数?有没有办法通过 R 中实现的一些标准标识符来分隔它们?

例如,我在 R 会话中使用 sets 包,如下所示。从下面给出的列表中,我将如何将辅助函数与主要函数分开。我可以通过阅读文档来做到这一点(有时它被明确记录为辅助函数),但是在 R 中实现了标准标识符,说函数是辅助函数还是主函数?

library(sets)

ls("package:sets")
[1] "%..%"                              "%<%"                               "%<=%"                             
[4] "%>%"                               "%D%"                               "%e%"                              
[7] "%is%"                              "as.cset"                           "as.gset"                          
[10] "as.interval"                       "as.set"                            "as.tuple"                         
[13] "binary_closure"                    "binary_reduction"                    "canonicalize_set_and_mapping"     
[16] "charfun_generator"                 "closure"                           "cset"                             
[19] "cset_bound"                        "cset_cardinality"                  "cset_cartesian"                   
[22] "cset_charfun"                      "cset_combn"                        "cset_complement"                  
[25] "cset_concentrate"                  "cset_contains_element"             "cset_core"                        
[28] "cset_defuzzify"                    "cset_difference"                   "cset_dilate"                      
[31] "cset_dissimilarity"                "cset_has_missings"                 "cset_height"                      
[34] "cset_intersection"                 "cset_is_crisp"                     "cset_is_empty"                    
[37] "cset_is_equal"                     "cset_is_fuzzy_multiset"            "cset_is_fuzzy_set"                
[40] "cset_is_multiset"                  "cset_is_proper_subset"             "cset_is_set"                      
[43] "cset_is_set_or_fuzzy_set"          "cset_is_set_or_multiset"           "cset_is_subset"                   
[46] "cset_matchfun"                     "cset_matchfun<-"                   "cset_mean"                        
[49] "cset_memberships"                  "cset_normalize"                    "cset_orderfun"                    
[52] "cset_orderfun<-"                   "cset_outer"                        "cset_peak"                        
[55] "cset_power"                        "cset_product"                      "cset_similarity"                  
[58] "cset_sum"                          "cset_support"                      "cset_symdiff"                     
[61] "cset_transform_memberships"        "cset_union"                        "cset_universe"                    
[64] "e"                                 "fuzzy_bell"                        "fuzzy_bell_gset"                  
[67] "fuzzy_cone"                        "fuzzy_cone_gset"                   "fuzzy_inference"                  
[70] "fuzzy_logic"                       "fuzzy_normal"                      "fuzzy_normal_gset"                
[73] "fuzzy_partition"                   "fuzzy_pi3"                         "fuzzy_pi3_gset"                   
[76] "fuzzy_pi4"                         "fuzzy_pi4_gset"                    "fuzzy_rule"                       
[79] "fuzzy_sigmoid"                     "fuzzy_sigmoid_gset"                "fuzzy_system"                     
[82] "fuzzy_trapezoid"                   "fuzzy_trapezoid_gset"              "fuzzy_triangular"                 
[85] "fuzzy_triangular_gset"             "fuzzy_tuple"                       "fuzzy_two_normals"                
[88] "fuzzy_two_normals_gset"            "fuzzy_variable"                    "gset"                             
[91] "gset_bound"                        "gset_cardinality"                  "gset_cartesian"                   
[94] "gset_charfun"                      "gset_combn"                        "gset_complement"                  
[97] "gset_concentrate"                  "gset_contains_element"             "gset_core"                        
[100] "gset_defuzzify"                    "gset_difference"                   "gset_dilate"                      
[103] "gset_dissimilarity"                "gset_has_missings"                 "gset_height"                      
[106] "gset_intersection"                 "gset_is_crisp"                     "gset_is_empty"                    
[109] "gset_is_equal"                     "gset_is_fuzzy_multiset"            "gset_is_fuzzy_set"                
[112] "gset_is_multiset"                  "gset_is_proper_subset"             "gset_is_set"                      
[115] "gset_is_set_or_fuzzy_set"          "gset_is_set_or_multiset"           "gset_is_subset"                   
[118] "gset_mean"                         "gset_memberships"                  "gset_normalize"                   
[121] "gset_outer"                        "gset_peak"                         "gset_power"                       
[124] "gset_product"                      "gset_similarity"                   "gset_sum"                         
[127] "gset_support"                      "gset_symdiff"                      "gset_transform_memberships"       
[130] "gset_union"                        "gset_universe"                     "integers"                         
[133] "integers2reals"                    "interval"                          "interval_complement"              
[136] "interval_contains_element"         "interval_difference"               "interval_division"                
[139] "interval_domain"                   "interval_intersection"             "interval_is_bounded"              
[142] "interval_is_closed"                "interval_is_countable"             "interval_is_degenerate"           
[145] "interval_is_empty"                 "interval_is_equal"                 "interval_is_finite"               
[148] "interval_is_greater_than"          "interval_is_greater_than_or_equal" "interval_is_half_bounded"         
[151] "interval_is_left_bounded"          "interval_is_left_closed"           "interval_is_left_open"            
[154] "interval_is_left_unbounded"        "interval_is_less_than"             "interval_is_less_than_or_equal"   
[157] "interval_is_proper"                "interval_is_proper_subinterval"    "interval_is_right_bounded"        
[160] "interval_is_right_closed"          "interval_is_right_open"            "interval_is_right_unbounded"      
[163] "interval_is_subinterval"           "interval_is_unbounded"             "interval_is_uncountable"          
[166] "interval_measure"                  "interval_power"                    "interval_product"                 
[169] "interval_sum"                      "interval_symdiff"                  "interval_union"                   
[172] "is.charfun_generator"              "is.cset"                           "is.gset"                          
[175] "is.interval"                       "is.set"                            "is.tuple"                         
[178] "is_element"                        "LABEL"                             "LABELS"                           
[181] "make_set_with_order"               "matchfun"                          "naturals"                         
[184] "naturals0"                         "pair"                              "reals"                            
[187] "reals2integers"                    "reduction"                         "set"                              
[190] "set_cardinality"                   "set_cartesian"                     "set_combn"                        
[193] "set_complement"                    "set_contains_element"              "set_dissimilarity"                
[196] "set_intersection"                  "set_is_empty"                      "set_is_equal"                     
[199] "set_is_proper_subset"              "set_is_subset"                     "set_outer"                        
[202] "set_power"                         "set_similarity"                    "set_symdiff"                      
[205] "set_union"                         "sets_options"                      "singleton"                        
[208] "triple"                            "tuple"                             "tuple_is_ntuple"                  
[211] "tuple_is_pair"                     "tuple_is_singleton"                "tuple_is_triple"                  
[214] "tuple_outer"  

【问题讨论】:

  • 请定义“辅助函数”和“主函数”。
  • 我认为“辅助函数”在 R 中没有任何技术意义。

标签: r cran


【解决方案1】:

除非您使用package_name:::helper_function_name 语法,否则通常不会导出“辅助”函数(定义为:由主函数使用且通常不由最终用户直接使用的函数)并且不可见。如果一个功能是可见的并记录在案,它通常是一个主要功能。所以,如果你想查看主要功能,只需使用ls

ls("package:sets")

如果你想要所有功能(main + helper):

ls(getNamespace("sets"))

最后,要获得辅助函数,请使用setdiff

setdiff(ls(getNamespace("sets")), ls("package:sets"))

看到这个SO Q/A for some discussion

一个潜在的歧义是,有时S3 方法没有明确导出,即使它们打算用作“主要”函数。

【讨论】:

  • 您能否举个例子说明导出 S3 方法时的歧义。谢谢
  • @Sathish,以methods(print) 为例,看看这些方法中有多少带有星号。其中许多函数是由print 调度的,但实际上是主要函数,但它们不需要可见,因为它们是由print 调度的,因此通常不导出此类函数。
【解决方案2】:

R 库的NAMESPACE 文件应该包含一个导出的列表 - 公开的函数。因此,对于公开的(因此是公共的)和非公开的(因此是内部/私有的)功能有很好的定义。 “主要”和“辅助”功能没有正式定义。您可能会争辩说只应该公开“主要”功能,但我认为这并不明确。

一个懒惰的开发者有时包括 exportPattern("^[[:alpha:]]+") 在 NAMESPACE 文件中,从而公开所有功能。在这种情况下,我可能会怀疑该库的公开函数都与主/辅助函数混合在一起。但是,当我检查setsNAMESPACE 文件时,它组织得非常好。因此,我相信sets 的公开功能得到了很好的维护和必要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-29
    • 2019-11-05
    • 2015-03-14
    • 2016-03-14
    • 2020-06-09
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    相关资源
    最近更新 更多