【问题标题】:print or display variable inside function在函数内打印或显示变量
【发布时间】:2014-03-30 03:57:47
【问题描述】:

有没有办法print 或在函数内部显示变量的值,而不是在函数被调用后在函数外部打印值?

我几乎可以肯定并认为代码被称为 reveal 或类似名称,但我不记得正确的术语。

my.function <- function(x) {

  y <- x^2
 #  reveal(y)
 #  display(y)

 # desired result is to print or display here:
 # [1] 16

  cat(y)
  print(y)
  return(y)  
}

x <- 4

my.function(x)
#16[1] 16
#[1] 16

cat(y)print(y)return(y) 都在函数外打印。谢谢你的建议。

编辑

我在这里发现了一个类似的问题:

https://stat.ethz.ch/pipermail/r-help/2002-November/027348.html

Peter Dalgaard 对这个问题的回答是取消选中 Misc 选项卡下名为 buffered output 的选项。但是,这似乎不适用于我的情况。也许这些问题是无关的。

【问题讨论】:

  • 我很困惑。你是什​​么意思,他们在函数之外打印?你说的是不可能的,因为4 甚至还没有被传递给函数......
  • 数字16出现在}之后。
  • 当然可以!在定义函数之前,无法将4 传递给函数。
  • 看看?debug,它将逐步执行函数并允许您在函数执行的不同点检查对象。试一试,尝试debug(my.function); my.function(4),然后在其定义之后和调用return之前的任何时间输入y
  • 你也可以试试message,它在“从函数内打印”方面做得很好——我也用它来调试并行操作。

标签: r printing


【解决方案1】:

我喜欢使用message 函数来打印以进行调试,因为它似乎从它可能发出的任何黑暗深度到达控制台。例如:

somefunc <- function(x) {
       message(paste('ok made it this far with x=',x))
       # some stuff to debug
       message(paste('ok made it this far with x^2=',x^2))
       # some more stuff to debug
       message(paste('ok made it to the end of the function with x^3=',x^3))
}

【讨论】:

  • 不错的功能!我有一个print() 包裹着一个prettyNum(),它在控制台中返回0.0001000000000001。将print() 更改为message() 给了我想要的0.0001print() 在某些情况下似乎忽略了prettyNum(),不确定它是怎么回事......
【解决方案2】:

您可以将print() 调用(或cat() 调用)放在函数内部,如果执行到达该点,那么即使稍后在执行过程中发生错误,也会在控制台上生成输出。 (如果您使用的 IDE 设置为“缓冲输出”,则可能需要 flush.console()。)

 > myf <- function(x){ print(x); y <- x^2; print(y); error() }
> myf(4)
[1] 4
[1] 16
Error in myf(4) : could not find function "error"

使用 browser() 函数作为调试路径可能更优雅。您可以通过更改 options() 来设置它的操作:

> options(error=recover)
> myf(4)
[1] 4
[1] 16
Error in myf(4) : could not find function "error"

Enter a frame number, or 0 to exit   

1: myf(4)

Selection: 1
Called from: top level 
Browse[1]> x
[1] 4
Browse[1]> y
[1] 16
Browse[1]>    # hit a <return> to exit the browser 

Enter a frame number, or 0 to exit   

1: myf(4)

Selection: 0   # returns you to the console

【讨论】:

  • 非常好。浏览器功能和调试功能的清晰示例很有价值。如果可以的话,我会投票两次。
【解决方案3】:

当我问这个问题时,我可能一直在考虑 show 函数,它允许您查看变量的值,而无需在 return 语句中包含该变量。虽然,show 命令在函数之外打印值。

my.function <- function(x) {
     y <- x^2
     show(y)
     show(length(y))
     z <- y + x
     return(z)
}

x <- 1:10

my.function(x)

 # [1]   1   4   9  16  25  36  49  64  81 100
 # [1] 10
 # [1]   2   6  12  20  30  42  56  72  90 110

编辑:2021 年 3 月 19 日

从函数内部查看结果的另一种方法是将对象发送到全局变量。这可能有助于定位函数内部的错误。

my.function <- function(x) {
     y <- x^2
     y <<- y
     z <- y + x
     z <<- z
     return(z)
}
y
#[1]   1   4   9  16  25  36  49  64  81 100
z
#[1]   2   6  12  20  30  42  56  72  90 110
x <- 1:10
my.function(x)
#[1]   2   6  12  20  30  42  56  72  90 110

【讨论】:

  • show 函数不一定会返回值。它将显示任何定义为 S4 对象的 show 函数的结果。对于没有定义特定show 方法的类的S4 对象,它调用showDefault 并输出关于其类的消息,然后遍历槽。对于基本或 S3 类的普通对象,它只调用print。我想如果对象是一个列表(就像cat 那样),就不会窒息更安全。
  • 我不认为&lt;&lt;- 一定要在全局环境中赋值。相反,我相信它是在调用环境中分配的,这可能是也可能不是全局环境。但是,当我检查帮助页面时,我发现它“导致[s]通过父环境搜索正在分配的变量的现有定义。如果找到这样的变量(并且它的绑定未锁定),那么它的值被重新定义,否则赋值发生在全局环境中。"
猜你喜欢
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
  • 2020-02-11
  • 2023-03-08
相关资源
最近更新 更多