无法在函数内保存对象

问题描述 投票: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")  

} 

myfunction(dat)

它的绘图很好,它在max_A / max_B添加点(所以它实际上获取max_Amax_B的信息,但它不是创建对象results。如果我在函数中单独执行每一行,它可以工作,但它只是没有'作为一个功能工作,我不知道为什么。

r function
3个回答
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练习来说,定义返回值总是好的,即使它是另一行写入。


0
投票

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

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

results<-myfunction(dat)

再次感谢你的帮助。


-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)

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

为什么正常的退货不起作用?

我们可能会将return局部变量输出到Global Environment,但请记住,它只返回返回的局部变量的值,而不返回局部变量本身。

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

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,但在全球环境中没有给我们一个名为“y”的变量。如果我们真的想在那里使用y,我们必须保存add(1)的结果,并将其命名为“y”,即y <- add1(1)。而不是在屏幕上显示“2”,现在它被保存为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是空的。

© www.soinside.com 2019 - 2024. All rights reserved.