R 語言


前置

想隨便了解一下 R 語言,結果被迫入坑,一開始就被整懵了,R 三件套:R、Rtools、RStudio 的配置環境讓我想起了從前配置 JAVA 的恐懼。不過后面可能會接觸到 R markdown,可能對網站建設有幫助,不虧,然后可能也會用 VScode 搞 R,畢竟 RStudio 才剛碰,沒有什么感情

理解的背景

R 語言是統計學家開發的,出生之初就決定了它的使命是統計計算和數據可視化,這算是 R 語言核心功能的兩個大方向

對於這兩個方向而言

統計計算的學習。基礎都在課堂理論與專業背景上,說實話,R 語言只是提供了一個實現的平台而已,它並不該改變或者創造新的理論、模型

數據可視化方向。則稍有不同,數據可視化確實並不十分依賴數學,但是他高度依賴圖形語法(分別是基礎圖形語法、高級圖形語法、lattice 語法、ggplot2 語法),依賴可視化視覺呈現理念

關於R語言學習技能路徑:

通用技能學習:

基礎:數據結構、變量類型、數據導入/導出、數據合並追加、長寬轉換、數據索引、切片、聚合

進階:正則表達式、合並與分列、匹配與替換、缺失值插補、去重與排序,控制流:循環與判斷

專用技能學習:

統計與分析:課本書籍

數據可視化:ggplot2 語法 + 設計 + 審美 + 創意

R 語言的優劣勢是什么?

下載與配置環境

R

https://mirrors.tuna.tsinghua.edu.cn/CRAN/index.html

Rtools40

https://mirrors.tuna.tsinghua.edu.cn/CRAN/index.html

RStudio

https://www.rstudio.com/products/rstudio/download/#download

配置

由於配置 Rtools 必須要用 RStudio,所以我才下載了它

配置 R 參考文章:cmd下的R語言環境變量配置

# 現在環境變量中配置下面幾條
R_HOME=D:\R\R-4.1.1
PATH=%R_HOME%\bin

配置 Rtools40 參考文章:官網RTools40的環境配置

# 現在環境變量中配置下面兩條
RTOOLS40_HOME=D:\Rtools\rtools40
PATH=%RTOOLS40_HOME%\usr\bin

# 在 RStudio 中運行下面命令
file.edit('~/.Renviron')

# 將下面代碼寫入打開的文件中
writeLines('PATH="${RTOOLS40_HOME}\\usr\\bin;${PATH}"', con = "~/.Renviron")

# 重啟

# 在 RStudio 中運行下面命令
system('where make')

# 若顯示下面回應,則說明成功
D:\Rtools\rtools40\usr\bin\make.exe

配置 Vscode 中 R 的插件

# 在 RStudio 中運行下面命令
install.packages("languageserver")

下面是 Vscode 推薦下載的插件

直接在 Vscode 插件區下載:radian、R Debugger

# 在 RStudio 中運行命令下載
install.packages("httpgd")

檢測 Rtools 與 R

# 在 cmd 輸入以下命令
r
rscript

# 不知道為什么在 powershell 輸入 r 運行不了,但 r.exe 可以運行

配置環境如下:

基礎學習(混亂版)

R 官方文檔

變量賦值

feature:

  1. 有效的變量名稱由字母,數字以及點號 . 或下划線 _ 組成
  2. 最新版本的 R 語言的賦值可以使用左箭頭 <-、等號 = 、右箭頭 -> 賦值
# 正常
myString <- "Hello, World!"
print ( myString )
# Hello, World!

# feature 1
var.1 = c(0,1,2,3) 
print(var.1)
# 0 1 2 3

變量處理

# 查看變量
print(ls())
# "var.1" "var.2" "var.3"

# 刪除變量
rm(var.3)

cat() 函數

cat(1, "加", 1, "等於", 2, '\n')
# 1 加 1 等於 2

# 輸出內容到文件
cat("ACMICPC", file="C:\Users\14805\Desktop\acm.txt")

sink() 函數

feature:

  1. append 參數是追加寫入,否找覆蓋
  2. split 屬性是依然保留控制台的輸出,否找不顯示
sink("r_test.txt", split=TRUE)  # 控制台同樣輸出
for (i in 1:5)
    print(i)
sink()   # 取消輸出到文件
# 1
# 2
# 3
# 4
# 5

注釋

# 單行注釋就是 #

"
多行注釋就是雙引號
"

運算符

# 1 到 10 的向量
v <- 1:10
print(v)

# 判斷數字是否在向量 v 中
v1 <- 3
v2 <- 15
print(v1 %in% v)
print(v2 %in% v)

# 數學函數
sqrt(4)
# 2
exp(1)
# 2.718282
exp(2)
# 7.389056
log(2,4)
# 0.5
log10(10000)
# 4

round(1.5)
# 2
round(2.5)
# 2
round(3.5)
# 4
round(4.5)
# 4
# round 函數當取整位是偶數的時候,五也會被舍去

數據類型(太多了,只挑重點寫)

# 向量
# c() 是一個創造向量的函數

> a[c(1, 3, 5)] # 取出第 1, 3, 5 項
[1] 10 30 50
> a[c(-1, -5)] # 去掉第 1 和第 5 項
[1] 20 30 40

> seq(1, 9, 2)
[1] 1 3 5 7 9

"
NA 代表的是 缺失,NULL 代表的是 不存在
NA 缺失就像占位符,代表這里沒有一個值,但位置存在
NULL 代表的就是數據不存在
"

> length(c(NA, NA, NULL))
[1] 2
> c(NA, NA, NULL, NA)
[1] NA NA NA

# 邏輯型
# 沒什么

# 矩陣

> m1 = matrix(c(1, 2), 1, 2)
> m2 = matrix(c(3, 4), 2, 1)
> m1 %*% m2
     [,1]
[1,]   11

判斷語句

# if / else /else if
# 沒什么

# switch
x <- switch(
   3,
   "google",
   "runoob",
   "taobao",
   "weibo"
)
print(x)
[1] "taobao"

you.like<-"runoob"
switch(you.like, google="www.google.com", runoob = "www.runoob.com", taobao = "www.taobao.com")
[1] "www.runoob.com"

> x <- switch(4,"google","runoob","taobao")
> x
NULL

循環

# repeat
v <- c("Google","Runoob")
cnt <- 2

repeat {
   print(v)
   cnt <- cnt+1
   
   if(cnt > 5) {
      break
   }
}
[1] "Google" "Runoob"
[1] "Google" "Runoob"
[1] "Google" "Runoob"
[1] "Google" "Runoob"

# while
v <- c("Google","Runoob")
cnt <- 2

while (cnt < 7) {
   print(v)
   cnt = cnt + 1
}
[1] "Google" "Runoob"
[1] "Google" "Runoob"
[1] "Google" "Runoob"
[1] "Google" "Runoob"
[1] "Google" "Runoob"

# for
v <- LETTERS[1:4]
for ( i in v) {
   print(i)
}
[1] "A"
[1] "B"
[1] "C"
[1] "D"

# next
v <- LETTERS[1:6]
for ( i in v) {
   
   if (i == "D") {  # D 不會輸出,跳過這次循環,進入下一次
      next
   }
   print(i)
}
[1] "A"
[1] "B"
[1] "C"
[1] "E"
[1] "F"

函數

# 通用公式
"
function_name <- function(arg_1, arg_2, ...) {
    // 函數體
}
"

# 內置函數
# 輸出  32 到 44 到的所有數字
print(seq(32,44))

# 計算兩個數到平均數
print(mean(25:82))

# 計算 41 到 68 所有數字之和
print(sum(41:68))

[1] 32 33 34 35 36 37 38 39 40 41 42 43 44
[1] 53.5
[1] 1526

# 函數還可以傳入函數,格式就是將函數名傳入即可

字符串

c <- "雙引號字符串中可以包含單引號(') "
print(c)

d <- '單引號字符串中可以包含雙引號(") '
print(d)

文件腳本

feature:

后綴為 .R

后話

整體感覺和 python 無異,基礎都一樣,難的地方還沒開始學,以后再說...

既然適用於統計和繪制,感覺 python 完全可以替代,但是語法雖然差不多,但是社區開源的包不同嘛,所以條件適宜的話,還是兩個都學吧,畢竟這些都只是工具而不是思想~

預學習

RMarkdown:基礎語法和用法blogdown 網站


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM