【问题标题】:R - skipping of commands in functionR - 跳过函数中的命令
【发布时间】:2013-09-27 14:58:14
【问题描述】:

当我有数据矩阵时

mI <- c(1:4, 2, 6, 9)
mJ <- c(4:1, 5, 0, 2)

以及下面的简单回归函数

fLM <- function(mX, mY){
       lmXY <- lm(mY~mX)
       summary(lmXY)
       return(lmXY)
}

很明显,我想使用命令summary(lmXY)在函数中打印回归的结果。但是使用 LM

当我使用

在函数中建立 Bloomberg 连接时,会发生类似的情况
conn <- blpConnect()

在函数后面的几个命令中,我使用 blpDisconnect(conn) 断开与 Bloomberg 的连接。下一个命令返回检索到的数据。但是,虽然 blpConnect() 完美运行,但 blpDisconnect(conn) 命令被跳过。数据的返回完美执行。当我手动与彭博建立连接然后使用断开连接功能时没有问题。但不知何故,在包含 return 的函数中(我不确定这是否是原因,这只是一个观察)存在问题。有人知道为什么吗?

BB函数的全局代码:

fnBB <- function(){
        conn <- blpConnect()
        ...
        blpDisconnect(conn)
        return(mData)
} 

非常感谢。

【问题讨论】:

  • 我认为这是一个函数只能返回一个对象的方式。 summary 的输出是你试图返回到父环境的东西,它被return 覆盖。如果您cat(summary, file = "somefile"),您将看到内容被捕获在该文件中(尽管存在格式问题)。我不知道发生这种情况的实际原因,因此发表评论。

标签: r function return


【解决方案1】:

对象不会在函数中打印,除非:

  1. 您明确告诉函数打印它。
  2. 该对象就是函数返回的对象。

您应该改为运行 print(summary(lmXY))

f1 <- function() {1 ; 2}
f2 <- function() {print(1) ; 2}
f3 <- function() {print(1) ; return(2)} # identical to f2

f1() #prints 2
object = f1() #stores 2, prints nothing
object = f2() #stores 2, prints 1
f2() #prints 1 and 2

【讨论】:

  • 忍者被优秀的 SenorO !幸运的是我的名字不是 Inigo Montoya :-)
  • 我会准备死,只是为了安全。
【解决方案2】:

如果您在常规提示符下键入命令并且该命令未在某处分配输出,则 R 将在返回的值上调用 print。但是在函数或循环内部不会发生这种自动打印(参见 FAQ 7.16)。因此,如果您想打印摘要信息,只需调用 print 函数即可。

注意summary 函数通常不打印任何内容,它们返回一个由print.summary 函数打印的摘要对象。当您删除 return 语句时,summary 调用是函数中的最后一件事,因此返回值(摘要对象)是函数返回的内容。如果您在没有将结果分配给任何内容的情况下调用该函数,则自动打印开始。使用 return 语句,将返回 lmXY 对象,因此将打印该对象(但如果将其设置为不可见则不会打印)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2016-07-14
    • 2011-04-10
    • 2015-10-11
    • 2022-06-10
    相关资源
    最近更新 更多