【问题标题】:How can I eliminate quote marks around parameters in R function?如何消除 R 函数中参数周围的引号?
【发布时间】:2011-02-16 00:52:49
【问题描述】:

下面是一个有效的 R 函数的前几行:

teetor <- function(x,y) {

require("quantmod")
require("tseries")

alpha <- getSymbols(x, auto.assign=FALSE)
bravo <- getSymbols(y, auto.assign=FALSE)

t     <- as.data.frame(merge(alpha, bravo))

# ... <boring unit root econometric code>

}

当我将两个股票代码作为函数参数传递时,我需要用引号将它们括起来:

teetor("GLD", "GDX")

我希望能够简单地输入:

teetor(GLD, GDX)

【问题讨论】:

  • 向协整之王致敬?
  • 重构 Paul Teetor 的代码,这是 Ernie Chan 的 MATLAB 代码的 R 实现。函数名泄露了它。

标签: function r quantmod


【解决方案1】:

不要。为了节省几次击键而牺牲清晰、简单的代码是个坏主意。您创建了一个只能以交互方式使用的函数,不能从另一个函数调用。

【讨论】:

  • 完全同意——“过早的优化”,太聪明了等等。另请参阅有关“值得学习的好代码示例”的当前 r-devel 线程。这不会是一个。
  • 我完全同意。 @hadley 说是完美的。在长时间维护代码方面,拥有清晰、简单的代码大有帮助。
  • 如果您使用良好的开发环境,如 Eclipse,可能还有 ESS,您将获得双倍的报价(自动完成)。
  • 我相信更好的解决方案是创建一个循环遍历股票列表并输出结果的函数,这样我就可以避免将其作为参数输入,带或不带引号
【解决方案2】:

有几种方法可以做到这一点,但通常我不建议这样做。

通常调用不带引号的东西意味着对象本身在搜索路径中。一种不分配的方法是使用with() 函数。

您可以通过deparse(substitute(...)) 获得某物的名称,而无需它实际存在:

> blah <- function(a) {
    deparse(substitute(a))
  }
> blah(foo) 
[1] "foo"
> foo 
Error: object 'foo' not found

因此,原则上您可以使用deparse(substitute(...)) 获取名称,如上例中的teetor 函数,而不是传入名称。

【讨论】:

  • 我在 getSymbols() 代码前面嵌入了 blah() 函数,然后将其传递给 getSymbols 函数,如下所示:getSymbols(blah(x), auto.assign=FALSE) 和有用。这节省了大量的打字。谢谢!我没有发布其余代码只是因为我认为它与问题无关,但如果有人感兴趣,它在我的 github 上 RMilk/task_reference/specific_analysis/teetor_deparsed.r。
  • 顺便说一句,虽然这回答了问题,但我的代码仍然由于其他一些未知原因而损坏。因此,如果您冒险访问我的 github 帐户,请提前警告。
  • 我很抱歉,但我认为这是有效的,但它却从不知道在哪里抓取对象。正如我在注释中实现的那样,这不起作用。
  • @Milktrader (1) 我们都说这是个坏主意。 (2) blah 函数仅用作示例,并非实际使用。您需要了解deparse(substitute(...)) 才能完成这项工作。
  • 这确实回答了这个问题,因此值得勾选。我应该提出“对消除引号进行编码是否可行”这个问题,但这落在了我身上。谢谢肖恩。
【解决方案3】:

好吧,我想一个解决方案是:

GLD <- "GLD"
GDX <- "GDX"
teetor(GLD,GDX)     # No need to quote GLD and GDX

再想一想,没关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    相关资源
    最近更新 更多