无法在功能中保存对象

时间:2018-02-15 07:22:04

标签: r function

我被困住了,不知道它能弄清楚我错过了什么。我确定它不是一件小事,但我真的不明白为什么我的代码不起作用。

myfunction <- function( X ) {

plot(X, type="l")
max_B <- max(X$B)   
max_A <- X$A[ X$B  == max_B ]
results<-c(max_A, max_B)
points(max_A, max_B, col="red")  

} 

myfunction(dat)

它的绘图很好,它在max_A / max_B添加了点(因此它实际上获取了max_A和{的信息{1}},但它没有创建对象max_B。如果我单独执行函数中的每一行,它都可以工作,但它不能作为一个函数工作,我没有想法为什么。

3 个答案:

答案 0 :(得分:3)

您可能需要返回该对象。

myfunction <- function( X ) {
  plot(X, type="l")
  max_B <- max(X$B)   
  max_A <- X$A[ X$B  == max_B ]
  results<-c(max_A, max_B)
  points(max_A, max_B, col="red")  
  return(results)
} 

results <- myfunction(dat)

如果这还没有解决问题,请在问题中提供dat的结果,提供dput(dat)的日期。

你不需要总是在函数中返回。函数的默认设置是返回上次保存的对象或最后一个指令。在您的情况下,points函数没有或不可见的返回,或者至少没有您期望的那个。 我认为对于clean code练习来说,定义返回值总是好的,即使它还有一行要写。

答案 1 :(得分:0)

我想提供一些反馈意见,以防其他人遇到此问题。正确的答案实际上是由drmariod发布的,但我错过了最重要的部分。我不仅要返回我的对象​​,而且在执行函数时实际上将返回的输出保存到新对象中。它就在那里说 - 我只是完全忽视了这一部分。

myfunction<-function()
{...
return(object)}

results<-myfunction(dat)

再次感谢您的帮助。

答案 2 :(得分:-1)

results以上的任务分配到您的全局环境中,以解决您的问题。

myfunction <- function( X ) {

  plot(X, type="l")
  max_B <- max(X$B)   
  max_A <- X$A[ X$B  == max_B ]
  results <<- c(max_A, max_B)
  points(max_A, max_B, col="red")  

} 

myfunction(dat)

有关<<-的详细信息,请查看Hadley Wickham撰写的How do you use “<<-” (scoping assignment) in R?以及 Advanced R 中的Environment chapter。您将了解更多有关R范围跨环境变量的信息。

  

为什么正常的回报不起作用?

我们可能return局部变量输出到全局环境,但请记住,只返回返回的局部变量的值,而不返回局部变量本身

例如,如果我们创建一个函数,只需将一个函数添加到给定数字:

add1 <- function(x) {
  y <- x + 1
  return(y)
  # return(x + 1) will also do but I save it as y for better demonstration
}

add1(1)在屏幕上给我们2,但是没有给我们一个名为&#34; y&#34;的变量。在全球环境中。如果我们真的想要y,我们必须保存add(1)的结果,并将其命名为&#34; y&#34;,即y <- add1(1)。而不是显示&#34; 2&#34;在屏幕上,现在它保存为y

<<-的技巧是将作业推送到其父环境。在此回答中,results <<- c(max_A, max_B)发生在myfunction,其父级环境恰好是全球环境,因此我们会在执行results后找到myfunction

  

为什么我可以使用这些对象来绘制点,而不是将相同的对象保存到新对象中?

对象max_Amax_Bmyfunction本地生效,因此您可以在该范围内执行任何操作。在您的原始代码中,results确实已保存,但仍然只存在于myfunction环境中。

值得一提的是,与大多数其他功能不同,plotpoints会返回无对象而是图形,因此它们不受环境范围的限制。您可以尝试x <- 1:10; y <- x + rnorm(10); myplot <- plot(x, y),然后您会看到一个情节,但myplot为空。