1. 运行的条件是一元逻辑向量(TRUEFALSE)并且不能有缺失(NA)。else部分是可选的。如果
  2. 仅有一个语句,花括号也是可以省略的。
  3. 下面的代码片段是一个例子:
  4. if(interactive()){
  5. plot(x, y)
  6. } else {
  7. png("myplot.png")
  8. plot(x, y)
  9. dev.off()
  10. }
  11. 如果代码交互运行,interactive()函数返回TRUE,同时输出一个曲线图。否则,曲线图被存
  12. 在磁盘里。你可以使用第21章中的if()函数。
  13. . ifelse()
  14. ifelse()是函数if()的量化版本。矢量化允许一个函数来处理没有明确循环的对象。
  15. ifelse()的格式是:
  16. ifelse(test, yes, no)
  17. 其中test是已强制为逻辑模式的对象,yes返回test元素为真时的值,no返回test元素为假时
  18. 的值。
  19. 比如你有一个p值向量,是从包含六个统计检验的统计分析中提取出来的,并且你想要标记
  20. p<.05水平下的显著性检验。可以使用下面的代码:
  21. > pvalues <- c(., ., ., ., ., .)
  22. > results <- ifelse(pvalues <., "Significant", "Not Significant")
  23. > results
  24. [] "Not Significant" "Significant" "Significant"
  25. [] "Not Significant" "Significant" "Not Significant"
  26. ifelse()函数通过pvalues向量循环并返回一个包括"Significant""Not Significant"
  27. 的字符串。返回的结果依赖于pvalues返回的值是否大于0.
  28. 同样的结果可以使用显式循环完成:
  29. pvalues <- c(., ., ., ., ., .)
  30. results <- vector(mode="character", length=length(pvalues))
  31. for(i in :length(pvalues)){
  32. if (pvalues[i] < .) results[i] <- "Significant"
  33. else results[i] <- "Not Significant"
  34. }
  35. 可以看出,向量化的版本更快且更有效。
  36. 有一些其他的控制结构,包括while()、repeat()和switch(),但是这里介绍的是最常用
  37. 的。有了数据结构和控制结构,我们就可以讨论创建函数了。
  1. 20.1. 创建函数
  2. R中处处是函数。算数运算符+、-、/和*实际上也是函数。例如, + 2等价于 "+"(, )。
  3. 本节将主要描述函数语法。语句环境将在20-2节描述。
  4. . 函数语法
  5. 函数的语法格式是:
  6. functionname <- function(parameters){
  7. statements
  8. return(value)
  9. }
  10. 如果函数中有多个参数,那么参数之间用逗号隔开。
  11. 参数可以通过关键字和/或位置来传递。另外,参数可以有默认值。请看下面的函数:
  12. f <- function(x, y, z=){
  13. result <- x + (*y) + (*z)
  14. return(result)
  15. }
  16. > f(,,)
  17. []
  18. > f(,)
  19. []
  20. > f(x=, y=)
  21. []
  22. > f(z=, y=, )
  23. []
  24. 在第一个例子中,参数是通过位置(x=,y=,z=)传递的。在第二个例子中,参数也是通过
  25. 位置传递的,并且z默认为1。在第三个例子中,参数是通过关键字传递的,z也默认为1。在最后
  26. 一个例子中,yz是通过关键字传递的,并且x被假定为未明确指定的(这里x=)第一个参数。
  27. 参数是可选的,但即使没有值被传递也必须使用圆括号。return()函数返回函数产生的对
  28. 象。它也是可选的;如果缺失,函数中最后一条语句的结果也会被返回。
  29. 你可以使用args()函数来观测参数的名字和默认值:
  30. > args(f)
  31. function (x, y, z = )
  32. NULL
  33. args()被设计用于交互式观测。如果你需要以编程方式获取参数名称和默认值,可以使用
  34. formals()函数。它返回含有必要信息的列表。
  35. 参数是按值传递的,而不是按地址传递。请看下面这个函数语句:
  36. result <- lm(height ~ weight, data=women)
  37. women数据集不是直接得到的。需要形成一个副本然后传递给函数。如果women数据集很大的话,
  38. 内存(RAM)可能被迅速用完。这可能成为处理大数据问题时的难题能需要使用特殊的技术(见

  1. #--------------------------------------------------------------------#
  2. # R in Action (2nd ed): Chapter #
  3. # Advanced R programming #
  4. # requires packages ggplot2, reshape2, foreach, doParallel #
  5. # install.packages(c("ggplot2", "reshap2e", "foreach", "doParallel"))#
  6. #--------------------------------------------------------------------#
  7.  
  8. # Atomic vectors
  9. passed <- c(TRUE, TRUE, FALSE, TRUE)
  10. ages <- c(, , , , )
  11. cmplxNums <- c(+2i, +1i, +3i, +2i)
  12. names <- c("Bob", "Ted", "Carol", "Alice")
  13.  
  14. # Matrices
  15. x <- c(,,,,,,,)
  16. class(x)
  17. print(x)
  18. attr(x, "dim") <- c(,)
  19. print(x)
  20. class(x)
  21. attributes(x)
  22. attr(x, "dimnames") <- list(c("A1", "A2"),
  23. c("B1", "B2", "B3", "B4"))
  24. print(x)
  25. attr(x, "dim") <- NULL
  26. class(x)
  27. print(x)
  28.  
  29. # Generic vectors (lists)
  30. head(iris)
  31. unclass(iris)
  32. attributes(iris)
  33.  
  34. set.seed()
  35. fit <- kmeans(iris[:], )
  36. names(fit)
  37. unclass(fit)
  38. sapply(fit, class)
  39.  
  40. # Indexing atomic vectors
  41. x <- c(, , )
  42. x[]
  43. x[c(,)]
  44. x <- c(A=, B=, C=)
  45. x[c(,)]
  46. x[c("B", "C")]
  47.  
  48. # Indexing lists
  49. fit[c(,)]
  50. fit[]
  51. fit[[]]
  52. fit$centers
  53. fit[[]][,]
  54. fit$centers$Petal.Width # should give an error
  55.  
  56. # Listing 20.1 - Plotting the centroides from a k-mean cluster analysis
  57. fit <- kmeans(iris[:], )
  58. means <- fit$centers
  59. library(reshape2)
  60. dfm <- melt(means)
  61. names(dfm) <- c("Cluster", "Measurement", "Centimeters")
  62. dfm$Cluster <- factor(dfm$Cluster)
  63. head(dfm)
  64. library(ggplot2)
  65. ggplot(data=dfm,
  66. aes(x=Measurement, y=Centimeters, group=Cluster)) +
  67. geom_point(size=, aes(shape=Cluster, color=Cluster)) +
  68. geom_line(size=, aes(color=Cluster)) +
  69. ggtitle("Profiles for Iris Clusters")
  70.  
  71. # for loops
  72. for(i in :) print(:i)
  73. for(i in :)print(:i)
  74.  
  75. # ifelse
  76. pvalues <- c(., ., ., ., ., .)
  77. results <- ifelse(pvalues <., "Significant", "Not Significant")
  78. results
  79.  
  80. pvalues <- c(., ., ., ., ., .)
  81. results <- vector(mode="character", length=length(pvalues))
  82. for(i in :length(pvalues)){
  83. if (pvalues[i] < .) results[i] <- "Significant"
  84. else results[i] <- "Not Significant"
  85. }
  86. results
  87.  
  88. # Creating functions
  89. f <- function(x, y, z=){
  90. result <- x + (*y) + (*z)
  91. return(result)
  92. }
  93.  
  94. f(,,)
  95. f(,)
  96. f(x=, y=)
  97. f(z=, y=, )
  98. args(f)
  99.  
  100. # object scope
  101. x <-
  102. y <-
  103. z <-
  104. f <- function(w){
  105. z <-
  106. x <- w*y*z
  107. return(x)
  108. }
  109. f(x)
  110. x
  111. y
  112. z
  113.  
  114. # Working with environments
  115. x <-
  116. myenv <- new.env()
  117. assign("x", "Homer", env=myenv)
  118. ls()
  119. ls(myenv)
  120. x
  121. get("x", env=myenv)
  122.  
  123. myenv <- new.env()
  124. myenv$x <- "Homer"
  125. myenv$x
  126.  
  127. parent.env(myenv)
  128.  
  129. # function closures
  130. trim <- function(p){
  131. trimit <- function(x){
  132. n <- length(x)
  133. lo <- floor(n*p) +
  134. hi <- n + - lo
  135. x <- sort.int(x, partial = unique(c(lo, hi)))[lo:hi]
  136. }
  137. trimit
  138. }
  139. x <- :
  140. trim10pct <- trim(.)
  141. y <- trim10pct(x)
  142. y
  143. trim20pct <- trim(.)
  144. y <- trim20pct(x)
  145. y
  146.  
  147. ls(environment(trim10pct))
  148. get("p", env=environment(trim10pct))
  149.  
  150. makeFunction <- function(k){
  151. f <- function(x){
  152. print(x + k)
  153. }
  154. }
  155.  
  156. g <- makeFunction()
  157. g ()
  158. k <-
  159. g ()
  160.  
  161. ls(environment(g))
  162. environment(g)$k
  163.  
  164. # Generic functions
  165. summary(women)
  166. fit <- lm(weight ~ height, data=women)
  167. summary(fit)
  168.  
  169. class(women)
  170. class(fit)
  171. methods(summary)
  172.  
  173. # Listing 20.2 - An example of a generic function
  174. mymethod <- function(x, ...) UseMethod("mymethod")
  175. mymethod.a <- function(x) print("Using A")
  176. mymethod.b <- function(x) print("Using B")
  177. mymethod.default <- function(x) print("Using Default")
  178.  
  179. x <- :
  180. y <- :
  181. z <- :
  182. class(x) <- "a"
  183. class(y) <- "b"
  184.  
  185. mymethod(x)
  186. mymethod(y)
  187. mymethod(z)
  188.  
  189. class(z) <- c("a", "b")
  190. mymethod(z)
  191. class(z) <- c("c", "a", "b")
  192. mymethod(z)
  193.  
  194. # Vectorization and efficient code
  195. set.seed()
  196. mymatrix <- matrix(rnorm(), ncol=)
  197. accum <- function(x){
  198. sums <- numeric(ncol(x))
  199. for (i in :ncol(x)){
  200. for(j in :nrow(x)){
  201. sums[i] <- sums[i] + x[j,i]
  202. }
  203. }
  204. }
  205. system.time(accum(mymatrix)) # using loops
  206. system.time(colSums(mymatrix)) # using vectorization
  207.  
  208. # Correctly size objects
  209. set.seed()
  210. k <-
  211. x <- rnorm(k)
  212.  
  213. y <-
  214. system.time(for (i in :length(x)) y[i] <- x[i]^)
  215.  
  216. y <- numeric(k)
  217. system.time(for (i in :k) y[i] <- x[i]^)
  218.  
  219. y <- numeric(k)
  220. system.time(y <- x^)
  221.  
  222. # Listing 20.3 - Parallelization with foreach and doParallel
  223. library(foreach)
  224. library(doParallel)
  225. registerDoParallel(cores=)
  226.  
  227. eig <- function(n, p){
  228. x <- matrix(rnorm(), ncol=)
  229. r <- cor(x)
  230. eigen(r)$values
  231. }
  232. n <-
  233. p <-
  234. k <-
  235.  
  236. system.time(
  237. x <- foreach(i=:k, .combine=rbind) %do% eig(n, p)
  238. )
  239.  
  240. system.time(
  241. x <- foreach(i=:k, .combine=rbind) %dopar% eig(n, p)
  242. )
  243.  
  244. # Finding common errors
  245. mtcars$Transmission <- factor(mtcars$a,
  246. levels=c(,),
  247. labels=c("Automatic", "Manual"))
  248. aov(mpg ~ Transmission, data=mtcars) # generates error
  249. head(mtcars[c("mpg", "Transmission")])
  250. table(mtcars$Transmission) # here is the source of the error
  251.  
  252. # Listing 20.4 - A sample debugging session
  253. args(mad)
  254. debug(mad)
  255. mad(:)
  256. # enters debugging mode
  257. # Q to quit - see text
  258. undebug(mad)
  259.  
  260. # Listing 20.5 - Sample debugging session with recover()
  261. f <- function(x, y){
  262. z <- x + y
  263. g(z)
  264. }
  265. g <- function(x){
  266. z <- round(x)
  267. h(z)
  268. }
  269.  
  270. h <- function(x){
  271. set.seed()
  272. z <- rnorm(x)
  273. print(z)
  274. }
  275. options(error=recover)
  276.  
  277. f(,)
  278. f(, -) # enters debugging mode at this point

吴裕雄--天生自然 R语言开发学习:高级编程的更多相关文章

  1. 吴裕雄--天生自然 R语言开发学习:R语言的安装与配置

    下载R语言和开发工具RStudio安装包 先安装R

  2. 吴裕雄--天生自然 R语言开发学习:数据集和数据结构

    数据集的概念 数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量.表2-1提供了一个假想的病例数据集. 不同的行业对于数据集的行和列叫法不同.统计学家称它们为观测(observation)和 ...

  3. 吴裕雄--天生自然 R语言开发学习:导入数据

    2.3.6 导入 SPSS 数据 IBM SPSS数据集可以通过foreign包中的函数read.spss()导入到R中,也可以使用Hmisc 包中的spss.get()函数.函数spss.get() ...

  4. 吴裕雄--天生自然 R语言开发学习:使用键盘、带分隔符的文本文件输入数据

    R可从键盘.文本文件.Microsoft Excel和Access.流行的统计软件.特殊格 式的文件.多种关系型数据库管理系统.专业数据库.网站和在线服务中导入数据. 使用键盘了.有两种常见的方式:用 ...

  5. 吴裕雄--天生自然 R语言开发学习:R语言的简单介绍和使用

    假设我们正在研究生理发育问 题,并收集了10名婴儿在出生后一年内的月龄和体重数据(见表1-).我们感兴趣的是体重的分 布及体重和月龄的关系. 可以使用函数c()以向量的形式输入月龄和体重数据,此函 数 ...

  6. 吴裕雄--天生自然 R语言开发学习:基础知识

    1.基础数据结构 1.1 向量 # 创建向量a a <- c(1,2,3) print(a) 1.2 矩阵 #创建矩阵 mymat <- matrix(c(1:10), nrow=2, n ...

  7. 吴裕雄--天生自然 R语言开发学习:图形初阶(续二)

    # ----------------------------------------------------# # R in Action (2nd ed): Chapter 3 # # Gettin ...

  8. 吴裕雄--天生自然 R语言开发学习:图形初阶(续一)

    # ----------------------------------------------------# # R in Action (2nd ed): Chapter 3 # # Gettin ...

  9. 吴裕雄--天生自然 R语言开发学习:图形初阶

    # ----------------------------------------------------# # R in Action (2nd ed): Chapter 3 # # Gettin ...

  10. 吴裕雄--天生自然 R语言开发学习:基本图形(续二)

    #---------------------------------------------------------------# # R in Action (2nd ed): Chapter 6 ...

随机推荐

  1. PAT Basic 1023 组个最⼩数 (20) [贪⼼算法]

    题目 给定数字0-9各若⼲个.你可以以任意顺序排列这些数字,但必须全部使⽤.⽬标是使得最后得到的数尽可能⼩(注意0不能做⾸位).例如:给定两个0,两个1,三个5,⼀个8,我们得到的最⼩的数就是1001 ...

  2. JQuery 点击子控件事件,不会触发父控件的事件

     $('.order-delete').on('tap', function (e) {                  console.log('删除1');                  c ...

  3. IDEA中使用Lombok时候,getter,setter注解不生效/每次重启后才生效

    Relevance.java代码如下: import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; imp ...

  4. ZJNU 1164 - 考试排名——中级

    1.如果一个单元为0,表示没做过这题,不计入成绩 2.如果一个单位为负数,表示做错了这题,不计入成绩 所以只要一个单元为正数(不论是否有括号)都说明做出了这一题,计入成绩 将名字和成绩都当作字符串读入 ...

  5. 一个简单WebApp的全程

    开始前,我先给出上一篇选项卡的demo链接http://xqhuadou.com/demo1/index.html.相信看着应该很带感,不过这个是之前经过修改的. 制作过程我就不多说了,可以直接看源码 ...

  6. 如何判断Office是32位还是64位?

    对于持续学习VBA的老铁们,有必要了解Office的位数. 如果系统是32位的,则不需要判断Office位数了,因为只能安装32位Office. 下面只讨论64位系统中,Office的位数判断问题. ...

  7. 小白学习之pytorch框架(5)-多层感知机(MLP)-(tensor、variable、计算图、ReLU()、sigmoid()、tanh())

    先记录一下一开始学习torch时未曾记录(也未好好弄懂哈)导致又忘记了的tensor.variable.计算图 计算图 计算图直白的来说,就是数学公式(也叫模型)用图表示,这个图即计算图.借用 htt ...

  8. P1781 宇宙总统

    题目地址:https://www.luogu.com.cn/problem/P1781 题目描述:地球历公元 6036 年,全宇宙准备竞选一个最贤能的人当总统,共有 n 个非凡拔尖的人竞选总统,现在票 ...

  9. tf.boolean_mask

    tf.boolean_mask 的作用是 通过布尔值 过滤元素 def boolean_mask(tensor, mask, name="boolean_mask", axis=N ...

  10. 关于mysql数据库连接异常处理

    tomcat启动错误日志关键信息: 28-Aug-2019 14:22:55.014 SEVERE [localhost-startStop-1] org.apache.catalina.core.C ...