R语言函数编写

作者: 芒果芭乐 | 来源:发表于2018-11-10 08:59 被阅读69次

语言函数编写是一个非常重要的技能,它能在没有任何包能实现自己的想要的功能的情况下,实现问题的解决。
在R中,不同行的语句会被视为不同的命令,如果想在同一行内放置多个命令函数,则需要在每个函数之间加上 ; 进行分割

控制流

R函数中的控制流函数和perl语言等都十分相像,在格式上有一些差别。

  • if
    if函数:if(条件){语句}else if(条件){语句}else{语句}
    在if函数中,只要else if中有一个条件满足后,后面所有的else if都会直接掠过。
  • repeat函数
    repeat不能自己跳出循环,要在使用了break命令后才能实现循环的结束
a=1
repeat{
  a=a+1
  if(a>10){
    print(a)
    break
}}

使用循环函数编写一个Fibonacci(斐波那契数列)数的程序:

a<-c(1,1);
repeat{
  if(a[length(a)]>1000){
    a<-a[-length(a)];break
  }
  a[length(a)+1]<-a[length(a)-1]+a[length(a)];
  }
>a
[1]   1   1   2   3   5   8  13  21  34  55  89 144 233 377 610 987

自定义函数

在R中使用function函数进行自定义函数的编写。

  • Usage
    function_name<-function( arglist ) expr
    return(value)
  • Arguments
    arglist:Empty or one or more name or name=expression terms.
    expr:An expression.
    value:An expression.

定义一个计算x*y+z结果的函数:

> fun<-function(x,y,z){
  a=x*y+z
  return(a) #在R中,可以不写return函数,在没有return函数的时候,会默认返回最后函数最后一行的值
}
> fun(1,2,3)
[1] 5
编写一个使用二分法求非线性方程根的函数
image.png
二分法:
对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。
二分法求解非线性函数在区间[1,2]上的根的R脚本:
fun<-function(x){
  x^3-x-1;
}
dichotomy<-function(fun,a,b,eps=1e-6){
  if(fun(a)*fun(b)>0){ 
    list(fail="寻找区间内没有根")
  }else{
    while((b-a)>1e-6){#精度要达到1e-6
      if(fun((a+b)/2)*fun(a)<0){
        b=(a+b)/2;
      }else{
        a=(a+b)/2
      }
    }
  }
  return((a+b)/2)
}
> dichotomy(fun,1,2)
[1] 1.324718

使用牛顿迭代公式求解非线性方程组



牛顿迭代算法原理: 林业科学研究院-符利勇老师-R语言与林业统计建模课程课件

https://www.matongxue.com/madocs/205.html # 马同学高等数学 如何通俗易懂地讲解牛顿迭代法?
https://www.matongxue.com/madocs/7.html # 马同学高等数学 如何通俗地解释泰勒公式?
https://www.guokr.com/question/461510/ #牛顿开方法的算法及其原理
https://baike.baidu.com/item/%E9%9B%85%E5%8F%AF%E6%AF%94%E7%9F%A9%E9%98%B5/10753754 #jacobian矩阵
http://jacoxu.com/jacobian%E7%9F%A9%E9%98%B5%E5%92%8Chessian%E7%9F%A9%E9%98%B5/ #Jacobian矩阵和Hessian矩阵
https://wenku.baidu.com/view/cac8012db4daa58da0114ae8.html #二元非线性方程组求根的牛顿迭代法

牛顿迭代法和二分法有一定的相似性,它们都是通过不断的迭代使得得到的值,不断趋近于真实阶。在牛顿迭代法中,是不断的得到函数图形的切线而来缩短与真实解的距离。
实现—课件内容

funs<-function(x){
  f<-c(x[1]^2+x[2]^2-5,(x[1]+1)*x[2]-(3*x[1]+1))
  J<-matrix(c(2*x[1],2*x[2],x[2]-3,x[1]+1), nrow=2,ncol=2,byrow=T)
  return(list(f=f, J=J))
}
Newtons<-function(funs,x,eps=1e-5,it_max=100){
  index<-0
  k<-1
  while(k<=it_max){
    x1<-x
    f.value<-funs(x)
    x<-x-solve(f.value$J,f.value$f)
    f.e<-sqrt((x-x1)%*%(x-x1))
    if (f.e<eps){
      index<-1
      break}
    k<-k+1}
  f.value<-funs(x)
  return(list(root=x,it_max=k,index=index,f.value=f.value$f))}
> Newtons (funs,c(0,1))
$`root`
[1] 1 2

$it_max
[1] 6

$index
[1] 1

$f.value
[1] 1.598721e-14 6.217249e-15

相关文章

  • R语言函数编写

    语言函数编写是一个非常重要的技能,它能在没有任何包能实现自己的想要的功能的情况下,实现问题的解决。在R中,不同行的...

  • R函数了解一下?🤓

    刘小泽写于18.8.29-30 R函数是什么? 其实就是对一些编程语言的封装,编写函数可以减少重复代码的书写,让R...

  • R语言常用函数整理(基础篇)

    R语言基础函数整理 R语言常用函数整理本篇是基础篇,即R语言自带的函数。 一、数据管理 vector:向量nume...

  • R for data Science(十二)

    接着我们进入该书的第三大章节 program 编写函数(一) 一直觉得编程能力好的人都会写函数,我对R语言写函数能...

  • R包开发的标准姿势

    内容目录 建立R包项目 打开项目文件夹 编写DESCRIPTION文件 编写R函数 编写文档 建立数据 数据文件描...

  • R | 基础函数编写

    自定义函数 R语言中有两个重要的组成,一是变量,用于存储数据;二是函数,用于操作数据。函数的组成离不开三个部分:函...

  • 哈佛R语言课程--3.函数、参数和R包

    学习目标 R语言函数的描述和应用。 使用参数修改R语言函数的默认操作 从R帮助文档获取有关函数的更多信息 创建用户...

  • 第2章 R编程入门(一):数据集

    2.1 R语言 R是一种解释性语言,输入后可直接给出结果。R功能烤函数实现,函数形式如下:函数(输入数据, 参数=...

  • R语言 函数

    函数是一组组合在一起以执行特定任务的语句。 R语言具有大量内置函数,用户可以创建自己的函数。在R语言中,函数是一个...

  • R语言函数

    1、gsub ##################################################...

网友评论

    本文标题:R语言函数编写

    本文链接:https://www.haomeiwen.com/subject/bxcgxqtx.html