我不确定这一点。以下是一个不起作用的函数示例:
myfunction<-function(){
mydata=read_excel("Square_data.xlsx", sheet = "Data", skip=0)
mydata$Dates=as.Date(mydata$Dates, format= "%Y-%m-%d")
mydata.ts=ts(mydata, start=2006, frequency=1)
}
文件无法加载。当我在R中逐行执行每个命令时,文件被加载,因此命令没有问题。我的问题是,我可以运行myfunction等函数来加载文件吗?感谢。
答案 0 :(得分:3)
函数中的最后一个语句是赋值如果函数中最后执行的语句是赋值,那么它将不会显示在控制台上,除非您使用print
但函数结果是然后,您可以在以后打印指定的值。例如,使用内置的BOD
数据框:
> f <- function() bod <- BOD
> f() # no result printed on console because f() was not explicitly printed
> print(f()) # explicitly print
Time demand
1 1 8.3
2 2 10.3
3 3 19.0
4 4 16.0
5 5 15.6
6 7 19.8
> X <- f() # assign and then print the assigned value
> X
Time demand
1 1 8.3
2 2 10.3
3 3 19.0
4 4 16.0
5 5 15.6
6 7 19.8
函数中的最后一个语句是生成结果的表达式如果最后一个语句产生的是值而不是赋值,则会在控制台上打印结果。例如:
> g <- function() BOD
> g()
Time demand
1 1 8.3
2 2 10.3
3 3 19.0
4 4 16.0
5 5 15.6
6 7 19.8
因此,如果您希望它自动显示在控制台上,请确保函数中的最后一个语句不是赋值。
注1:采购代码另外,请注意,如果您的代码是使用source()
语句获取的,或者代码是由其他函数调用的,那么它也不会自动打印控制台,除非您使用print
。
注2:两个结果关于问题的一些注释,如果要输出两个结果,则将它们输出到命名列表中。例如。这将输出一个名为BOD和BOD2的组件列表:
h <- function() list(BOD = BOD, BOD2 = 2*BOD)
h()
$BOD
Time demand
1 1 8.3
2 2 10.3
3 3 19.0
4 4 16.0
5 5 15.6
6 7 19.8
$BOD2
Time demand
1 2 16.6
2 4 20.6
3 6 38.0
4 8 32.0
5 10 31.2
6 14 39.6
我们可以像这样引用它们:
> H <- h()
> H$BOD
Time demand
1 1 8.3
2 2 10.3
3 3 19.0
4 4 16.0
5 5 15.6
6 7 19.8
> H$BOD2
Time demand
1 2 16.6
2 4 20.6
3 6 38.0
4 8 32.0
5 10 31.2
6 14 39.6
注3:&lt;&lt; - operator 关于问题的评论,一般情况下,应避免使用<<-
运算符,因为它会将您函数的内部链接到全局工作空间以一种看不见的,因此容易出错的方式。如果要返回值,通常最好将其作为函数的输出返回。在某些情况下<<-
是有保证的,但它们相对不常见。
答案 1 :(得分:1)
不确定。只需给它一个值即可返回:
myfunction<-function(){
mydata=read_excel("Square_data.xlsx", sheet = "Data", skip=0)
mydata$Dates=as.Date(mydata$Dates, format= "%Y-%m-%d")
ts(mydata, start=2006, frequency=1) # The last object is returned by an R function
}
所以调用dat <- myfunction()
会使dat
在函数内部创建的ts对象。
P.S。: R 中的return
函数也有。作为最佳实践,如果您想要提前返回对象,请使用此方法,例如与if