R入门(七) --- 函数、安装包

今日新闻

去海马体拍了证件照,最大的新闻,不会再有今天美美的样子啦,不会化妆的理科女的烦恼哇。over

正文(包治百病)

R中的包叫做–>程序包,分为“基础包”和“扩展包”。“基础包”默认安装加载的,“扩展包”是需要安装加载的。

写函数的格式,以一个简单的为例

newscore <- function(x){  #函数名 <- function(原材料)
  y <- sqrt(x) * 10  #对原材料进行处理
  return(y) #成品展示哪一部分,就return()
}

注释: 函数内部命名与外部无关,内部对某变量进行的操作,并不影响函数外环境中的变量。

newscore <- function(x=36){  #为函数设置默认值
  y <- sqrt(x) * 10  #
  return(y) 
}

注释: 为函数设置默认值,如果不设置,当输入的原材料不完整时,就会报错。
关于马尔萨斯人口增长模型,写函数

exponentialGrowth <- function(NO, r = 0.01, tmax =10 ){
  #输入三个自变量,初始值,增长率(默认为0.01),时间(默认为10)
  N <- NO
  for (t in 1:(tmax-1)) {
    N[t+1] <- N[t] + N[t] * r 
  }
  return(N)
}

注释: 注意函数名后面不需要加括号,exponentialGrowth 即可,不能写成exponentialGrowth (),会报错。

练习9.1,9.2写kaifang函数和cv函数,分别是开平方根和变异系数
kaifang <- function(x) sqrt(x)
cv <- function(x) print(sd(x)/mean(x))

注释: 如果操作语句较为简单,function()后可以直接接语句,也可以接print(),并且省略大括号。

要调用某个以.r 后缀文件内的函数,用source()语句
source(file = )

调用别人的扩展包

以计算日出日落为例

library(maptools) #或者
require(maptools)  # 调用包,让R把其中的函数读进R的脑子里。
position <- c(116.39, 39.91)  # 天安门广场的经纬度。
mydate <- "2017-10-01"  # 要计算的日期。
# 日出时刻:
sunriset(matrix(position, nrow = 1), 
         as.POSIXct(mydate, tz = "Asia/Shanghai"), 
         direction = c("sunrise"), POSIXct.out = TRUE)$time
# 日落时刻:
sunriset(matrix(position, nrow = 1), 
         as.POSIXct(mydate, tz = "Asia/Shanghai"), 
         direction = c("sunset"), POSIXct.out = TRUE)$time

想了解某安装包更多的函数

浏览器搜索 “cran + 包名”,比如在计算日出日落,用到了maptools包,可以搜索 cran maptools,便可以出现关于maptools包的所有信息,比如,

cran 包名
调用函数

新建函数名为flag,函数内是计算某日期开始,一定天数的日出日落具体时间
sunriset()函数,依次填入具体地点经纬度,时间,看日出还是日落

flag <- function(date.start = '2017-02-14', date.length = 7){
  mydate <- seq(as.POSIXct(date.start, tz = 'Asia/Shanghai'),
                by = 3600*24, length.out = date.length)
  data.frame(
    sunrise = sunriset(
      matrix(c(116.39, 39.91),nrow = 1),
      as.POSIXct(mydate, tz = 'Asia/Shanghai'),
      direction = c('sunrise'), POSIXct.out =TRUE)$time,
    sunset = sunriset(
      matrix(c(116.39,39.91), nrow = 1),
      as.POSIXct(mydate, tz = 'Asia/Shanghai'),
      direction = c('sunset'),POSIXct.out =TRUE)$time)
}
flag(date.start = '2019-3-15',date.length = 7)

练习9.4 计算所在地 2017-2116年,100年内的日出日落时间.

flag <- function(date.start = '2017-01-1', date.length = 100*365){
  mydate <- seq(as.POSIXct(date.start, tz = 'Asia/Shanghai'),
                by = 3600*24, length.out = date.length)
  data.frame(
    sunrise = sunriset(
      matrix(c(113.3477210000, 23.1280570000),nrow = 1),
      as.POSIXct(mydate, tz = 'Asia/Shanghai'),
      direction = c('sunrise'), POSIXct.out =TRUE)$time,
    sunset = sunriset(
      matrix(c(113.3477210000, 23.1280570000), nrow = 1),
      as.POSIXct(mydate, tz = 'Asia/Shanghai'),
      direction = c('sunset'),POSIXct.out =TRUE)$time)
}

#beginr包的介绍

#加载'beginr',大鹏创建的包(Zhao,2017a)
install.packages('beginr')
#采用包名称::函数,就不用library()和require()来加载包

备忘函数
之前不记得的点型、线型、颜色等东西,这里面都有

beginr::plotpch()
beginr::plotlty()
beginr::plotcolorbar()
beginr::plotcolors()
beginr::plottype()

快速作图函数

x <- 1:10
y <- 1:10 + rnorm(10)
beginr::plotlm(x = x,y = y,refline = TRUE)
#以上效果和下面这条同理,上面就是大鹏放在例子里的函数
example(plotlm)

根据函数的图形来看数据的分布,是否属于正态分布,函数为beginr::plothist()

example("plothist")
#例子函数为
x <- rnorm(10000)
beginr::plothist(x)

pairs成对散点图,强化版plotpairs(),plotpairs2()

example("plotpairs")
example("plotpairs2")

为了比较两个pairs的区别,我们设置种子,看一下画图结果

set.seed(123456)
df <- data.frame(a = 1:10,
                 b = 1:10 + rnorm(10),
                 c = 1:10 + rnorm(10))
beginr::plotpairs(df)
beginr::plotpairs2(df)

在这里插入图片描述
pairs2
注释:

  1. 根据plotpairs()和plotpairs2()分别画出了上示两图
  2. 斜对角线画的都是a,b,c各自的柱状图,左下角是两两散点图,以及拟合线,分别采取的是线性拟合,另一个拟合我就不知道了.右上角是R值和p值
  3. 不同之处在于.plotpairs2()比plotpairs()多画出拟合线
dfplot()函数或dfplot2()

一组自变量x和多组因变量y在同一坐标系;一组因变量y与多组自变量x在同一坐标系

par(mfrow = c(1,2), mar = c(0.1,0.1,0.1,0.1))
x <- seq(0, 2 * pi, length.out = 100)
y <- data.frame(sin(x), cos(x))

假定yerror是y的误差范围

yerror <- data.frame(abs(rnorm(100,sd = 0.3)),
                     abs(rnorm(100,sd = 0.1)))
beginr::dfplot(x, y, yerror = yerror)
beginr::dfplot2(y, x, xerror = yerror, xlab = '',ylab = '')

在这里插入图片描述
注释:

  • dfplot()和dfplot2()分别画的是自变量对因变量为(一对多),自变量对因变量为(多对一),关于误差,都是发生在多组变量中,就像dfplot()是因变量为yerror,dfplot2()为自变量xerror()

arrow()函数,可以用beginr包中的errorbar()函数,画出散点图的误差线

example('errorbar')
#等价于
x <- seq(0, 2 * pi, length.out = 100)
y <- sin(x)
plot(x,y, type = 'l')
beginr::errorbar(x, y, yupper = 0.1, ylower = 0.1)

计算任意两列的 R 2 R^2 R2,或者调整 R 2 R^2 R2,拟合直线的斜率、截距、各自的标准差、 P P P值。

example(lmdf)
#等同于
df <- data.frame(a = 1:10, 
                 b = 1:10 + rnorm(10), 
                 c = 1:10 + rnorm(10))
beginr::lmdf(df)

文件读写函数
都是在beginr包中的函数

  1. 一次性读入多个数据文件:beginr::readdir() 可以一次性将指定文件夹中的所有 据读入
  2. 可以避免将同名文件给覆盖:writefile()
  3. 将一个列表原模原样保存为文本文件:list2ascii()
example("list2ascii")
#等同于
alist <- list(a = 1:10, b = letters)
list2ascii(alist)
  1. bib()函数,为指定的R扩展包生成文献引用信息。这个函数可以直接打印出结果,也可以直接保存为’.bib’文件方便为’bookdown’或‘blogdown’调用,还可以方便地导入其他文件管理软件。 值得注意的是bib()中包的名字必须得是你R中已经安装好的
> beginr::bib(pkg = 'ggplot2')
@Book{R-ggplot2,
  author = {Hadley Wickham},
  title = {ggplot2: Elegant Graphics for Data Analysis},
  publisher = {Springer-Verlag New York},
  year = {2016},
  isbn = {978-3-319-24277-4},
  url = {http://ggplot2.org},
}
> beginr::bib(pkg = 'pinyin')
@Manual{R-pinyin,
  title = {pinyin: Convert Chinese Characters into Pinyin, Sijiao, Wubi or Other
Codes},
  author = {Peng Zhao},
  year = {2018},
  note = {R package version 1.1.5},
  url = {https://CRAN.R-project.org/package=pinyin},

R中的一些语录–>fortunes包

library('fortunes')
fortunes::fortune('Actually, I see it as part of my job')
vignette("fortunes") #生成一个PDF,里面是一些语录

应用R中的包,调出其参考文献及其格式–>citation()

> citation('lattice')

To cite the lattice package in publications use:

  Sarkar, Deepayan (2008) Lattice: Multivariate Data Visualization
  with R. Springer, New York. ISBN 978-0-387-75968-5

A BibTeX entry for LaTeX users is

  @Book{,
    title = {Lattice: Multivariate Data Visualization with R},
    author = {Deepayan Sarkar},
    publisher = {Springer},
    address = {New York},
    year = {2008},
    note = {ISBN 978-0-387-75968-5},
    url = {http://lmdvr.r-forge.r-project.org},
  }

查看R中已经发布的包的数量

length(unique(rownames(available.packages()))) #截至到此刻又13867个包了呢
#以上函数一层层释义为
a <- available.packages() # 获取所有扩展包的信息
b <- rownames(a) # 挑出扩展包的名称
c <- unique(b) # 去掉重复的名称
d <- length(c) # 数数有几个

查看某包从某日起被下载的情况

beginr::plotpkg('rmarkdown',from = '2014-01-01')
beginr::plotpkg('beginr',from = '2018-01-01')

练习9.6 制作动画(答案copy的,段位不够)

library(animation)
demo('fireworks')
citation('animation')

练习9.7 绘制风玫瑰图

library(openair)
example("windRose")
citation('openair')

关于R包的开发

  1. 首先,你要在 https://cran.r-project.org/bin/windows/Rtools/ 官方网站里面下载Rtools这个东西,我是下载在C盘的,C:\Rtools,之前以为这个是安装包,但是它是以exe结尾的,现在想想,应该是个应用程序吧,我安装在library里面是不可以的,最后卸载了,重装.
  2. 安装好之后,运行以下的两行代码,第三行是R显示出的结果,没报错,我就继续安装devtools,特别声明:在没有安装好Rtools之前,我装devtools是一直没有成功的,所以,建议先装Rtools,原理我也不大懂
> system('g++ -v')
> system('where make')
C:\Rtools\bin\make.exe
  1. 接下来就是安装一些包
install.packages(c('devtools','roxygen2','knitr','beginr'))
library('devtools')
library('roxygen2')
library('knitr')
library('beginr')
  1. 运行下述代码,在工作路径下生成一个rpkg的文件夹
beginr::rpkg()
  1. 打开其中的rpkg.Rproj,系统就默认用RStudio打开该项,在Files下找到DESCRITION文件,修改其中信息.修改并且Ctrl+s保存
Package: mypkg
Title: Caculate New Score
Version: 0.0.0
Author: Suzi Sun
Maintainer: Suzi Sun
Description: Get a better score.
License: GPL
Encoding: UTR-8
LazyData: true
  1. 在Files标签下,找到R/foo.R文件,这是存放自定义函数的地方,把其中的内容全部删掉,换成自己的函数,在把广百哦移动到函数名称的位置,按快捷键Ctrl+Shift+Alt+r,函数就会自动填补一些提示信息,我们需要把这些填充完整.(以下为例子)
#' Caculate new score
#'
#' @param x old score
#'
#' @return new score
#' @export
#'
#' @examples newscore(49)
newscore <- function(x) {
  y <- sqrt(x) * 10
  return(y)
}
  1. Ctrl+Shift+b,或者Build标签下的Build & Reload 按钮,包就自动编译、安装、加载好了。(然而我并没有成功,不知道为啥)
library(mypkg)
newscore(36)

example(newscore)

极简建包

  1. begin::rpkg()
  2. .修改DESCRIPTION,R/foo.R,
  3. 编译成包
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值