楼主: 热汤面皮儿
23030 5

[问答] R语言里funtion()的问题 [推广有奖]

  • 0关注
  • 0粉丝

高中生

50%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
186 点
帖子
21
精华
0
在线时间
17 小时
注册时间
2015-12-26
最后登录
2016-12-26

楼主
热汤面皮儿 发表于 2016-1-16 11:22:08 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
大家好,学习R的过程中,function(x){}这个函数一直不怎么会用。请问究竟什么情况需要用return,什么时候不需要返回呢?另外function(x){}这里的x要怎么设置,他代表什么,在之后运用这个函数的时候,x向谁取值?
例如在《r语言实战》里面lattice包里面自定义面板函数用到了如下一段代码
mypanel<-function(x,y){
                    panel.xyplot(x,y,pch=19)
                    panel.rug(x,y)
                    panel.grid(h=-1,v=-1)
                    panel.lmline(x,y,col="red",lwd=1,lty=2)
                }
xyplot(mpg~wt|dispacement,data=mtcars,panel=mypanel)

上面的代码中,在xyplot()里用到了自定义的函数,但是xyplot()括号里面并没有说x、y分别是谁啊?而且这里面function()也没有return。

请大家帮忙解答一下吧,谢谢了。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Fun R语言 TIO function Lattice function return

沙发
亚米UM 发表于 2016-1-16 13:25:57 来自手机
热汤面皮儿 发表于 2016-1-16 11:22
大家好,学习R的过程中,function(x){}这个函数一直不怎么会用。请问究竟什么情况需要用return,什么时候 ...
当你需要返回函数计算后的结果的时候就用return返回,如果单纯地画图或者存成文件等就不用Return了。你这个例子里面的xyplot和mypanel是两个不同的函数,所以他们的参数不同,不需要x和y。

藤椅
suimong 发表于 2016-1-16 20:47:48
亚米UM 发表于 2016-1-16 13:25
当你需要返回函数计算后的结果的时候就用return返回,如果单纯地画图或者存成文件等就不用Return了。你这 ...
首先纠正一个对R常见的误解:R的函数里不是必须用return()来返回结果的。R默认会返回函数体最后一行表达式的求值结果(这也是通常的情况),这点是R作为(偏)函数式语言和其他常见语言比如C++所不同的地方。引用一下R官方文档里的话(大家可以在console里输入?return查看):
If the end of a function is reached without calling return, the value of the last evaluated expression is returned.
在R里几乎所有的表达式都会有返回值,包括赋值(a<-1), 打印(print())。大家可以试试运行以下几个函数:
  1. fun0 <- function(){
  2.   f0<<-"fun0"
  3. }

  4. fun1 <- function(){
  5.   f1<<-"fun1"
  6.   print(f1)
  7. }

  8. fun2 <- function(){
  9.   plot(rnorm(100))
  10. }

  11. fun0()
  12. F0 <- fun0()

  13. fun1()
  14. F1 <- fun1()

  15. fun2()
  16. F2 <- fun2()
复制代码
fun0和fun1的返回值被记录在F0和F1中,而base R里的plot函数没有返回值,所以F2的值是NULL。但是lattice,ggplot2这两个绘图包的所有绘图却都是有返回值的(返回值就是一个所有构成图表元素的数据结构,通常是List):
  1. fun3 <- function(){
  2.   ggplot2::qplot(mpg, wt, data = mtcars)
  3. }

  4. fun4 <- function(){
  5.   x <- rnorm(500)
  6.   lattice::densityplot(~x)
  7. }

  8. fun3()
  9. F3 <- fun3()

  10. fun4()
  11. F4 <- fun4()
复制代码
return在R里的作用在于从控制流中间(if/else,for循环等)提前返回值并退出函数体。看下面的例子:
  1. # Demonstrate the use of "return()" ----------------------------------
  2. fun5 <- function(y) {
  3.   x <- sample(seq_len(y))
  4.   for(i in 1:5){
  5.     if(x[1]<5) {
  6.       print(paste("x[1] =", x[1]))
  7.       # return(sprintf("After %d times you got lucky!", i))
  8.       return(print(paste("After",i,"times you got lucky", collapse = "")))
  9.     } else {
  10.       x <- sample(x)
  11.     }
  12.   }
  13.   "Sorry, you didn't pick the winner soon enough!"
  14. }

  15. fun5(10)
  16. fun5(1000)
复制代码
这是我随便编的一个函数,对1:y的整数进行随机排序,如果某一次随机排序的结果使得第一个数小于5那么会打印一句话,如果五次排序完成都没能满足这个条件那么打印另外一句话(大家不要介意函数的写法哈,要实现相同功能肯定会有更好的办法,这里只是演示return的作用)。
那么fun5(10)就会对1:10的整数进行随机排序,有很大的概率你们会看到if体内return的那句话,然后函数就退出执行了,因此函数体最后的那句话这时是看不到的。而调用fun5(1000)时满足if条件的概率会很小,所以就有很大可能看到函数体最后一行的那句字符串。
P.S. fun5最后我没有用print函数而是直接写了一个字符串,就是想表明字符串也是可以作为表达式存在并且被返回的。

板凳
Wavegu 发表于 2016-1-17 10:10:19 来自手机
Xyplot的x,y就是你输入的x和y啊,本来是要分步画很多图,现在只是建立一个函数一次性画出来而已,类似plot函数都是直接画出来的,不需要return

报纸
happyqj 学生认证  发表于 2016-1-18 00:01:21
马克,明天试试楼上楼上的代码

地板
热汤面皮儿 发表于 2016-1-18 12:03:01
Wavegu 发表于 2016-1-17 10:10
Xyplot的x,y就是你输入的x和y啊,本来是要分步画很多图,现在只是建立一个函数一次性画出来而已,类似plot ...
谢谢你的回答,我发现function里面如果不用x,y,改成a,b这段代码就不能做出图了。也就是function里面的参数要根据后面的代码,这里是xyplot进行设置,而xyplot里面默认了xy的参数在什么位置?不知道我理解的对不对

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 06:17