【问题标题】:Overriding base::switch in R with package dependencies用包依赖覆盖 R 中的 base::switch
【发布时间】:2014-05-08 07:58:33
【问题描述】:

我想覆盖 switch 以使用除了长度为 1 的字符向量之外的符号。我将新定义包含在包 A 中。在包 B 中,我依赖包 A 并调用 switch 而不指定命名空间(例如 A::switch)。目前,在 B 中定义的在其定义中使用 switch 的函数正在使用基本版本。有什么方法可以强制他们使用A::switch 而不明确包含命名空间?

如果我在 B 中包含 switch 的新定义,则该包将按预期工作。目前,B 的 NAMESPACE 没有列出任何导入。

【问题讨论】:

  • 导入包A应该可以解决问题。您的命名空间中应该有一个导入。这是一本好书:obeautifulcode.com/R/How-R-Searches-And-Finds-Stuff
  • 你能解释一下“除了长度为一的字符向量之外还使用符号”是什么意思?什么符号不能是字符串?
  • @Carl,这正是覆盖开关的重点。即使每个符号都可以转换为字符向量,它也需要一个向量(符号不是)。例如,switch(substitute(a), a = 1, 2) 将引发错误,但 switch(as.character(substitute(a)), a = 1, 2) 将返回 1
  • 好吧,我的错 - 我在想“时髦的 Unicode 字体”含义中的“符号”,而不是 type symbolR objects

标签: r dependencies package


【解决方案1】:

switch 不需要字符向量。它需要一个“表达”。表达式被传递给评估者。所以它确实接受一个未加引号的 R“名称”,这就是我认为你所说的“符号”的意思,如果搜索树中有一个命名对象,则继续进行评估和匹配。

> a = 2
> switch(a , '1'='something', '2' = "else", "neither")
[1] "else"

符号aswitch 接受,因为它被评估为一个数值,所以执行了位置匹配。如果它已评估为一个字符,则将选择其他版本的匹配。请参阅 ?switch 和第 2 节:R 语言定义中的对象。

【讨论】:

  • 我认为你错过了他的意图——请参阅我上面关于type的评论
  • symbolname 都是 R 语言的同义词。它们指的是符合symbol 解析器规则的未加引号的字符串。我不认为我确实错过了他的意图,或者如果我错过了,那么他滥用了这个词。 switch 函数不需要“向量”作为第一个参数。它需要一个表达式(可以是一个如图所示的符号),并且它有两种不同的匹配... 值的模式。
  • 它不适用于未计算的表达式。它需要一个计算结果为向量的表达式。正如我上面所说,switch(substitute(a), a = 1, 2) 将不起作用。
  • substitute 不返回 R 表达式。它返回模式“调用”的对象。我认为您误用了“符号”一词。
猜你喜欢
  • 2018-11-01
  • 2015-11-21
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
相关资源
最近更新 更多