我被困住了,不知道它能弄清楚我错过了什么。我确定它不是一件小事,但我真的不明白为什么我的代码不起作用。
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
。如果我单独执行函数中的每一行,它都可以工作,但它不能作为一个函数工作,我没有想法为什么。
答案 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_A
和max_B
在myfunction
本地生效,因此您可以在该范围内执行任何操作。在您的原始代码中,results
确实已保存,但仍然只存在于myfunction
环境中。
值得一提的是,与大多数其他功能不同,plot
和points
会返回无对象而是图形,因此它们不受环境范围的限制。您可以尝试x <- 1:10; y <- x + rnorm(10); myplot <- plot(x, y)
,然后您会看到一个情节,但myplot
为空。