每每以为攀得众山小,可、每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~

———————————————————————————

后续加更内容:

应用一:if族有哪些成员呢?——if/ifelse/stopifnot

应用二:如何在循环中,实时输出时间消耗?

————————————————————————————————————

1、循环

##循环for
iris
allzl=unique(iris$setosa)
for (i in 1:2){
  pp=iris[iris$setosa==allzl[i],]
  plot(pp$Sepal.Length~pp$Sepal.Width)
}

for循环中,需要将数值组合起来,如果数据整齐可以用matrix;如果不整齐,用list,不等长合并的时候,rbind.fill函数可以很好将数据进行合并,并且补齐没有匹配到的缺失值为NA。

可参考:

R语言︱list用法、批量读取、写出数据时的用法


案 例

temp<-matrix(data = NA,181,31)
for (i in 1:31){
  temp[,i]<-filter(data[i]/7, rep(1, 7))
  }
yatmdata<-data.frame(temp)

代码利用matrix先定义一个181*31的空值矩阵,然后往里面灌数字。

2、switch分支语句

##switch分支语句
switch(1,mean(1:10),rnorm(4))  #执行mean(1:10)
switch(2,mean(1:10),rnorm(4))  #执行rnorm(4)
#由switch(x)来选择执行那个函数

3、while循环语句

注意执行顺序,先执行f[i]+f[i+1]<1000,然后往下走,与下面repeat有区别

##while循环语句
#计算斐波那契数列
f=1
f[2]=1
i=1
while(f[i]+f[i+1]<1000){
  f[i+2]=f[i]+f[i+1]
  i=i+1
}
f
#注意执行顺序,先执行f[i]+f[i+1]<1000,然后往下走,与下面repeat有区别

4、repeat循环

常常与if联用。

##repeat语句
#计算斐波那契数列
f=1
f[2]=1
i=1
repeat{
  f[i+2]=f[i]+f[i+1]
  i=i+1
  if (f[i]+f[i+1]>1000) break
};f
#与if常常联用,注意执行顺序,f[i]+f[i+1]>1000,与while<1000不同

与if常常联用,注意执行顺序,f[i]+f[i+1]>1000,与while<1000不同。

5、if函数+function

if和while都是需要数据TRUE/FALSE这样的逻辑类型变量,这就意味着,if内部,往往是对条件的判别,例如 is.na, is.matrix, is.numeric等等,或者对大小的比较,如,if(x > 0), if(x == 1), if(length(x)== 3)等等。

if后面,如果是1行,则花括号可以省略,否则就必须要将所有的语句都放在花括号中。这和循环是一致的

fun.test <- function(a, b, method = "add"){
    if(method == "add") { ## 如果if或者for/while;
        res <- a + b       ## 等后面的语句只有一行,则无需使用花括号。
}
    if(method == "subtract"){
        res <- a - b
    }
    return(res)           ## 返回值
}
### 检验结果
fun.test(a = 10, b = 8, method = "add")
fun.test(a = 10, b = 8, method = "substract")

同时if还有类似与excel的用法——ifelse

ifelse(Age > 30, "Old", "Young")

Age变量>30,则输出old;<30,输出Young

————————————————————————————————————————————————————————————

Function与循环函数结合的实践案例

1、函数如何输出?——print、return&list

如果是单个输出,直接用1.3方法即可

如果有很多输出项目,那么需要return(终止运算,并输出return中的项目)最终输出的项目

R中默认的情况是将最后一句作为返回值。

1.1 return&list组合

return和list的组合输出结果比较合理。(来自R语言︱噪声数据处理、数据分组——分箱法(离散化、等级化)

  1. sbdeep=function(data,parts,xiaoz){
  2. parts<-parts         #分几个箱
  3. xiaoz<-xiaoz         #极小值
  4. value<-quantile(data,probs = seq(0,1,1/parts))  #这里以data等比分为4段,步长为1/4
  5. number<-mapply(function(x){
  6. for (i in 1:(parts-1))
  7. {
  8. if(x>=(value[i]-xiaoz)&x<value[i+1])
  9. {
  10. return(i)
  11. }
  12. }
  13. if(x+xiaoz>value[parts])
  14. {
  15. return(parts)
  16. }
  17. return(-1)
  18. },data)
  19. #打标签L1L2L3L4
  20. return(list(degree=paste("L",number,sep=""),degreevalue=number,value=table(value),number=table(number)))               #将连续变量转化成定序变量,此时为L1,L2,L3,L4...根据parts
  21. }

该函数是对单个序列数据进行等深分箱,可以返回四类:

一个基于L1L2L3....的每个指标标签序列degree;

标签序列值degreevalue,

每个百分位数对应的变量值value,

不同百分点的数量number。

1.2 print直接输出

  function(){
    print(plot(cv.out))
  }

print可以直接输出.

1.3 直接输出——一一般都是直接输出

function(){
a=c(1:50)
a
}

其中a就是直接写在末尾,当做输出项。

2、function中应用if switch函数

test=function(mode=c("all", "out", "in")){
  mode <- switch(mode, out = 1, `in` = 2, all = 3)

  if (as.numeric(mode)==1) {
    t=1
  }

  if (as.numeric(mode)==2) {
    t=2
  }

  if (as.numeric(mode)==3) {
    t=3
  }
  t=t+1
  return(t+4)
}
a=test(mode="out")

test(mode="in")

test(mode="all")

解决场景:编写函数时候,可能嵌套很多模型的时候,就需要用这个流程。

switch函数,输入mode,执行相应的内容,此时是mode选择“all”,则执行返回1,;mode选择"out"则返回2;

然后用if去进行每个数字背后的建模,注意“==”
"in"注意要引号,因为会跟内嵌函数重叠

3 异常值处理——如何报错

  # 异常处理,当仅输入一个数据的时候,告知不能计算标准差
   if(length(x) == 1){
      stop("can not compute sd for one number,
           a numeric vector required.\n")
   }

————————————————————————————————————

应用一:if族有哪些成员呢?——if/ifelse/stopifnot

在函数中,if的应用场景非常多,用来识别某类情况前提下,再执行下一个。

其中笔者就见过这样三类if:if-else   ifelse   stopifnot

1、if-else

这个很常见,就是需要注意一下,if-else的写法,来看经管之家论坛一位坛友的提醒与使用心得:

if(){}else{}  表示先执行if括号后面的条件语句,如果正确就执行第一个大括号里的程序,如果错误就执行else后面大括号里的语句。
      有一种情况,r会报错:

if(){}
else{} 

就是这种情况,即else语句换了一行执行时,这是r会认为if语句已经执行完毕,但执行else发现前面无法执行,因此报错,在这里要提醒使用r的同志们,else必须紧挨着if语句后的大括号,这时才不会出错。

2、ifelse

跟If-else其实是一模一样的,但是效率提高很多,是提高代码运算效率很高的函数。ifelse()的句法格式类似于if()函数,但其运算速度却有了巨大的提升。即使是在没有预设数据结构且没有简化条件语句的情况下,其运算效率仍高于上述的两种方法。

ifelse(test, yes, no)

ifelse返回的是结果,有一点麻烦的是,不像if-else一样,可以写一些分布计算的东西,譬如现在有以下一种情况:

a<-c+d
sum(a>2)  #在c大于2的情况下,要计算a大于2的个数

这个分步情况在if-else里面很好解决,但是在ifelse里面可不容易,只能接受一步,所以尽量把运算链合并在一起。

3、stopifnot

这个函数跟Ifelse有点像,但是很奇特。stopifnot(c>2),如果正确执行,那么就会啥都没发生,如果错误了,就会跳入Debug模式,报错,让函数立刻停下来。

这个stopifnot跟trycatch函数联合使用,威力无比。

用tryCatch跳过:

  1. result = tryCatch(
  2. {expr},
  3. warning = function(w) {warning-handler-code},
  4. error = function(e) { error-handler-code},
  5. finally = {cleanup-code}
  6. )

出现warning、error时候怎么处理,就可以跳过了。例子:

  1. result = tryCatch(
  2. {segmentCN(txt)},
  3. warning = function(w) {"出警告啦"},
  4. error = function(e) { "出错啦"},
  5. )

分词时候,容易因为Lapply中断之后,就不会运行了,这样功亏一篑所以可以用这个办法跳过。

————————————————————————————————————

应用二:如何在循环中,实时输出时间消耗?


想知道循环中进行到哪里?这样可以合理安排函数进程。那么怎么办呢?

第一办法:使用Rstudio 1.0版本,里面有一个Profiling with profvis,可以很好的对你函数每一步的耗时进行参看。

R︱Rstudio 1.0版本尝鲜(R notebook、下载链接、sparkR、代码时间测试profile)

当然,这个不能实时输出内容。

第二办法:利用difftime函数

  1. t1 = Sys.time()
  2. for (i in 1:5){
  3. a=a+1
  4. b=a*a
  5. print(difftime(Sys.time(), t1, units = 'sec'))
  6. }

先预设当前时间,然后用difftime+print方式,循环输出。

本节内容来源于另一篇博客:R语言与格式、日期格式、格式转化

每每以为攀得众山小,可、每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~

———————————————————————————

R语言︱函数使用技巧(循环、if族/for、switch、repeat、ifelse、stopifnot)的更多相关文章

  1. R语言函数化学习笔记6

    R语言函数化学习笔记 1.apply函数 可以让list或者vector的元素依次执行一遍调用的函数,输出的结果是list格式 2.sapply函数 原理和list一样,但是输出的结果是一个向量的形式 ...

  2. R语言函数化学习笔记3

    R语言函数化学习笔记3 R语言常用的一些命令函数 1.getwd()查看当前R的工作目录 2.setwd()修改当前工作目录 3.str()可以输出指定对象的结构(类型,位置等),同理还有class( ...

  3. R语言函数化编程笔记2

    R语言函数化编程笔记2 我学过很多的编程语言,可以我写的代码很啰嗦,一定是我太懒了.或许是基础不牢地动山摇 1.为什么要学函数 函数可以简化编程语言,减少重复代码或者说面向对象的作用 2.函数 2.1 ...

  4. R语言函数化编程笔记1

    R语言函数化编程笔记1 notes:有一个不错的网站叫做stack overflow,有问题可以从上面找或者搜索答案,会有大佬相助. 在github上面可以找到很多R的扩展包,如果自己额修改被接受,那 ...

  5. R语言︱数据分组统计函数族——apply族用法与心得

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:apply族功能强大,实用,可以代替 ...

  6. R语言函数总结(转)

    R语言特征 对大小写敏感 通常,数字,字母,. 和 _都是允许的(在一些国家还包括重音字母).不过,一个命名必须以 . 或者字母开头,并且如果以 . 开头,第二个字符不允许是数字. 基本命令要么是表达 ...

  7. 【R笔记】R语言函数总结

    R语言与数据挖掘:公式:数据:方法 R语言特征 对大小写敏感 通常,数字,字母,. 和 _都是允许的(在一些国家还包括重音字母).不过,一个命名必须以 . 或者字母开头,并且如果以 . 开头,第二个字 ...

  8. 【转】R语言函数总结

    原博: R语言与数据挖掘:公式:数据:方法 R语言特征 对大小写敏感 通常,数字,字母,. 和 _都是允许的(在一些国家还包括重音字母).不过,一个命名必须以 . 或者字母开头,并且如果以 . 开头, ...

  9. r语言 函数

    R语言实际上是函数的集合,用户可以使用base,stats等包中的基本函数,也可以自己编写函数完成一定的功能.但是初学者往往认为编写R函数十分困难,或者难以理解.这里对如何编写R函数进行简要的介绍. ...

随机推荐

  1. vue项目中关于axios的简单使用

    axios介绍 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中 官方仓库:https://github.com/axios/axios 中文文档:htt ...

  2. JavaScript中的类继承

    JavaScript是一个无class的面向对象语言,它使用原型继承而非类继承.这会让那些使用传统面向对象语言如C++和Java的程序员们感到困惑.正如我们所看到的,JavaScript的原型继承比类 ...

  3. css选择器:nth-child()与:nth-of-type()的差异

    :nth-child()和:nth-of-type()都是Css3中的伪类选择器,其作用相似却又不完全相同. 名词解释 :nth-child()选择器匹配其父元素的第n个子元素,不论元素类型. :nt ...

  4. Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase

    上篇博客聊了<git分支管理之rebase 以及 cherry-pick相关操作>本篇博客我们就以Learning Git中的关卡进行展开.下方列举了LearningGit中的 merge ...

  5. 弥补wxpython无背景图片缺陷

    思路: 通过设置Panel的背景样式为wx.BG_STYLE_CUSTOM: self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) 绑定Panel的背景事情: sel ...

  6. pandas教程

    对pandas做最简单的介绍,针对初学者. 一.引入相关模块模块 import numpy as np import pandas as pd import matplotlib.pyplot as ...

  7. 《Web Scraping With Python》Chapter 1的学习笔记

    urllib urllib是python library自带的库,可以直接用. urlopen from urllib.request import urlopen html = urlopen(&q ...

  8. solr-搭建与使用过程中问题总结-链接

    以下错误可以确定在CDH版本Hbase集群+Lily hbase indexer+solrCloud的环境中可以解决,有开源版本解决成功案例的请在下方评论. 1.If you see this err ...

  9. openvpn服务器一键脚本生成客户端文件

    #!/bin/bash #获取参数 while getopts "n:" opt; do case $opt in n) client_name=$OPTARG ;; \?) ;; ...

  10. PHP将HTML的内容保存成word文档

    <?php class word { function start() { ob_start(); echo '<html xmlns:o="urn:schemas-micros ...