【问题标题】:"print" behaviour inside a function [duplicate]函数内的“打印”行为[重复]
【发布时间】:2015-06-12 05:21:28
【问题描述】:

在下面的简化示例中 当我通过只写“var”来询问变量“var”的值时 我什么也没收到。我必须使用打印功能 为了这个工作。 有人可以向我解释这种行为吗? 提前谢谢大家。

Foo <- function(){
    var <- 1
    var         # it does nothing
    print(var)  # 1
}

Foo()

另一方面,如果我们只写任何函数,它都可以正常工作:

var <- 2
var        # 2
print(var) # 2

【问题讨论】:

  • 是的,您需要printcat 来返回“var”,正如您清楚地表明的那样。
  • 我认为你是对的。在那里我看到一条评论“这是R中的那些怪癖之一”。我将稍等片刻,然后我将撤回这个问题。非常感谢帕斯卡。
  • @Pascal,这两个主题肯定有联系但并不完全相同,所以我认为这个问题是有效的。另一个问题的问题是为什么赋值不会产生返回值,而这个问题是关于为什么不打印语句。也许其他问题的答案让 OP 满意,但我认为让这个问题也保持开放也没有什么害处。

标签: r


【解决方案1】:

我相信答案是 R 不会打印函数内部发生的语句的结果,因为这可能会在运行其他人的代码时导致很多混乱。

你可能想做类似的事情

f <- function(x){
    na.fail(x)
    rowMeans(x)
}

其中na.fail 是一个函数,如果x 包含缺失值则停止执行,否则返回x。打印出 x 很可能不是作者想要的或用户想要的,因此 R 开发人员可能认为最好要求函数的作者明确说明应该打印的内容。

你当然可以争辩说上面的例子只是糟糕的编码,你应该这样做:

f <- function(x) rowMeans(na.fail(x))

尽管如此,R 的默认行为可能是最具防御性的解决方案。

但是,如果函数在最后一行返回值

Foo <- function(){
    var <- 1

    print("var")
    var         # it doesn't show var

    print("print(var)")
    var         # It shows var
}

当在 R 会话的顶层评估时它会被打印(即使没有打印!),即如果它被用户显式调用

Foo()
[1] "var"
[1] "print(var)"
[1] 1

这是因为Foo() 是它自己的语句,如果它存在于顶层,则返回一个被打印的值。但是,如果它发生在函数内部,则不会被打印出来。

f <- function(x){
    Foo()
    rowMeans(x)
}

除非它被传回顶部。

【讨论】:

  • 在谈到开发人员的决定时,您是对的。无论如何,让我们认为答案在于 Pascal 的建议是重复的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
相关资源
最近更新 更多