分享

R语言初学手册

 脑系科数据科学 2018-06-13

R语言的运行模式

  • 交互式: 交互式装载和运行R文件source(“abc.R”)
  • 批处理形式: 批处理运行Rscript abc.R

向量

创建向量: 

3:8
#> [1] 3 4 5 6 7 8
4:1
#> [1] 4 3 2 1
seq(3,8)
#> [1] 3 4 5 6 7 8
seq(3,8,2)
#> [1] 3 5 7
seq(from=12,to=21,by=3)
#> [1] 12 15 18 21
rep(0,5)
#> [1] 0 0 0 0 0
rep(1:2,3)
#> [1] 1 2 1 2 1 2
rep(c(1,2,3),each=2)
#> [1] 1 1 2 2 3 3

添加删除元素 

x<-c(1,2,3,4)
x<-c(x[1:3],5.5,x[4]) #添加5.5到最后一个元素之前
x
#> [1] 1.0 2.0 3.0 5.5 4.0
#删除第三个元素
y=x[-3]
y
#> [1] 1.0 2.0 5.5 4.0

获取向量长度 

x <- c(1,2,3,4,5,6)
length(x)
#> [1] 6

循环补齐

下面连个运算等价

x<-c(1,2,3)+ c(1,2,3,4,5,6)
x
#> [1] 2 4 6 5 7 9
x<-c(1,2,3,1,2,3) + c(1,2,3,4,5,6)
x
#> [1] 2 4 6 5 7 9

向量运算+,-,*,/,%%,>,<,== 运算都是先补齐,然后逐个元素进行运算

向量索引

y<-c(1,2,3,4,5,6)
y[c(1,3)] #第1,3个元素
#> [1] 1 3
y[c(1,1,3)]
#> [1] 1 1 3
y[1:3] #第一到第三个元素
#> [1] 1 2 3
y[-1:-2] #负数的下标表示把相应的元素剔除
#> [1] 3 4 5 6

any和all

x=seq(1,10)
any(x>7)
#> [1] TRUE
all(x>7)
#> [1] FALSE
all(x>0)
#> [1] TRUE

NA和NULL

NA缺失值,通常需要进行处理,如mean(x,na.rm=T)

NULL可用于在循环中创建向量

z<-NULL
for (i in 1:10) if(i %% 2 == 0) z<-c(z,i)
z
#> [1]  2  4  6  8 10

筛选

这里不需要一个map函数,可以直接像下面这样使用[进行筛选

z<-c(1,2,3,4,5)
#选出平方<4的元素
z[z*z > 4]
#> [1] 3 4 5

可以把筛选语句放在赋值运算符的左边,如

z <- 1:5
z[z*z>4] <- 0
z
#> [1] 1 2 0 0 0

subset也可用于筛选, 如:

z <- 5:1
subset(z,z>3)
#> [1] 5 4

选择函数which()

z <- 3:7
which(z*z>16) 
#> [1] 3 4 5
#which函数也可以用于筛选中,如
z[which(z*z>16)]
#> [1] 5 6 7

向量化ifelse

ifelse(b,u,v)

b <- c(1,0,1,0,0)
aa <- c(5,2,5,2,2)
bb <- c(15,12,15,12,12)
ifelse(b,aa,bb)
#> [1]  5 12  5 12 12

向量元素命名:

z<- 1:3
names(z) <-c('a','b','c')
names(z)
#> [1] "a" "b" "c"

去除重复元素

v1=c(1,2,2,3,4,3)
unique.default(v1)
#> [1] 1 2 3 4
v1[which(!duplicated(v1))]
#> [1] 1 2 3 4

向量运算

x=1:3
y=4:6
x+y
#> [1] 5 7 9
x-y
#> [1] -3 -3 -3
x*y
#> [1]  4 10 18
y / x
#> [1] 4.0 2.5 2.0
y %% x
#> [1] 0 1 0
y > x
#> [1] TRUE TRUE TRUE
y < x
#> [1] FALSE FALSE FALSE
y == x
#> [1] FALSE FALSE FALSE

矩阵和数组

由向量创建矩阵

y<-matrix(c(1,2,3,4,5,6),nrow=2)
y
#>      [,1] [,2] [,3]
#> [1,]    1    3    5
#> [2,]    2    4    6
y<-matrix(c(1,2,3,4,5,6),ncol=2)
y
#>      [,1] [,2]
#> [1,]    1    4
#> [2,]    2    5
#> [3,]    3    6
#也可用NA初始化一个矩阵
y<-matrix(nrow=2,ncol=3)
y
#>      [,1] [,2] [,3]
#> [1,]   NA   NA   NA
#> [2,]   NA   NA   NA
#矩阵是按列存储的。即先存第一列再存第二列。
#可以使用byrow=T参数来指定矩阵按行存储。 
#比较下面两个矩阵的区别
y<-matrix(1:16,nrow=4,byrow=T)
y
#>      [,1] [,2] [,3] [,4]
#> [1,]    1    2    3    4
#> [2,]    5    6    7    8
#> [3,]    9   10   11   12
#> [4,]   13   14   15   16
y<-matrix(1:16,nrow=4)
y
#>      [,1] [,2] [,3] [,4]
#> [1,]    1    5    9   13
#> [2,]    2    6   10   14
#> [3,]    3    7   11   15
#> [4,]    4    8   12   16

矩阵访问

y[,2] #取出y的第二列
#> [1] 5 6 7 8
y[1:2,] #取出y的第一二行
#>      [,1] [,2] [,3] [,4]
#> [1,]    1    5    9   13
#> [2,]    2    6   10   14
y[,1:2] #取出y的第一二列
#>      [,1] [,2]
#> [1,]    1    5
#> [2,]    2    6
#> [3,]    3    7
#> [4,]    4    8
y[2:3,2:3] #取出y的子矩阵
#>      [,1] [,2]
#> [1,]    6   10
#> [2,]    7   11

矩阵元素筛选

矩阵元素筛选

#取出y的行,其第二列>7,并且第三列>10
y[y[,2]>7 & y[,3]>10,]
#> [1]  4  8 12 16

矩阵运算

矩阵相乘 %\*%  这个不是逐元素计算的,而是数学上的矩阵相乘,要逐元素相乘,使用*运算符

对矩阵的行和列调用函数

apply(m,dimcode,f,fargs) m是矩阵,dimcode指定行或者列,1表示行,2表示列。f为要使用的函数,fargs是可选参数

apply(y,1,mean) 对y每行求平均。

apply(y,1,mean)
#> [1]  7  8  9 10

需要注意apply函数返回的矩阵元素排列的行列问题,必要时使用t()函数对矩阵进行转置。

改变矩阵大小

cbind,rbind分别为矩阵添加列和添加行,两个向量也可以直接构造矩阵,

cbind(c(1,2),c(3,4))
#>      [,1] [,2]
#> [1,]    1    3
#> [2,]    2    4

矩阵的长度

因为矩阵也是向量,所以length(y)返回的是矩阵的元素个数。nrow(y),ncol(y)分别返回矩阵的行数和列数

矩阵的行列命名

y <- matrix(1:4,nrow=2)
colnames(y)<-c('col1','col2')
rownames(y)<-c('row1','row2')
y
#>      col1 col2
#> row1    1    3
#> row2    2    4

数组

数组的构造

array(data = NA, dim = length(data), dimnames = NULL)

高维数组

R中用不同的行表示不同的观测,不同的列表示不同的变量,如果再添加上时间变量,数据就变成三维的了。三维数组是在矩阵的基础上再添加一个层的概念。如

firsttest<-matrix(c(1,2,3,4),ncol=2)
secondtest<-matrix(c(5,6,7,8),ncol=2)
tests<-array(c(firsttest,secondtest),dim=c(2,2,2))
tests
#> , , 1
#> 
#>      [,1] [,2]
#> [1,]    1    3
#> [2,]    2    4
#> 
#> , , 2
#> 
#>      [,1] [,2]
#> [1,]    5    7
#> [2,]    6    8

其中dim最后一个2表示数据分为两层。tests中的数据由三个下标来访问。

一维数组和向量的区别

x=1:10
xa=array(x)
x
#>  [1]  1  2  3  4  5  6  7  8  9 10
xa
#>  [1]  1  2  3  4  5  6  7  8  9 10
#dim的返回值不同
dim(x)
#> NULL
dim(xa)
#> [1] 10
#class不同
class(x)
#> [1] "integer"
class(xa)
#> [1] "array"

二维数组和矩阵的区别

列表

创建列表

j<-list(name='jianghang',age=24,salary=1000,url='http://www.')
j
#> $name
#> [1] "jianghang"
#> 
#> $age
#> [1] 24
#> 
#> $salary
#> [1] 1000
#> 
#> $url
#> [1] "http://www."
k<-list(1:5,2:10)
k
#> [[1]]
#> [1] 1 2 3 4 5
#> 
#> [[2]]
#> [1]  2  3  4  5  6  7  8  9 10

列表元素访问

j[['name']]
#> [1] "jianghang"
j[[1]]
#> [1] "jianghang"
j[1]
#> $name
#> [1] "jianghang"
#列表中的名字
names(j)
#> [1] "name"   "age"    "salary" "url"

注意双中括号和单中括号的区别,单中括号返回的是列表类型,双中括号则返回的是单个元素类型。

添加元素

j[['phone']]=13623232323

删除元素

j[['phone']]=NULL

获取列表长度

length(j)
#> [1] 4

列表上的apply函数

lapply()对列表的每个组件执行给定函数,如

lapply(list(1:3,2:4),mean) #返回列表形式。
#> [[1]]
#> [1] 2
#> 
#> [[2]]
#> [1] 3
sapply(list(1:3,2:4),mean) #返回的是向量形式。
#> [1] 2 3

sapply也可以返回矩阵形式,如果执行的函数返回的是向量。

递归列表定义

rl<-list(a=1,b=list(1:3,2:4))
rl
#> $a
#> [1] 1
#> 
#> $b
#> $b[[1]]
#> [1] 1 2 3
#> 
#> $b[[2]]
#> [1] 2 3 4

数据框

数据框结构类似矩阵,只是每列的数据类型可以不一样。但是每列的长度是要求一样的。

创建数据框:d<-data.frame(a=c(1,2,3,4),names=c(“a”,”b”,”c”,”d”))

访问元素:d$a 访问a列, d$names访问names列, 也可用矩阵方式来访问: d[,1] 得到d的第一列

提取子数据框: d[2:3,2,drop=FALSE] 注意这里的drop参数,表示返回的依然是一个数据框而不是向量

缺失值的处理: 如果d中有NA,可以用complete.cases来去掉缺失值. d[complete.cases(d),] 即为没有缺失值的行组成的数据框

rbind和cbind可同样用于数据框,只是要求行或者列的长度与原数据框一样

如果数据框的每列数据类型相同,可以使用apply函数, 使用方法和矩阵一样。

合并数据框:merge(x,y), merge根据x,y中的同名列来合并x,y的列. 如果x,y中没有同名的列,可以用by.x , by.y来指定列的名字。

数据框是列表的特列,可以像列表那样在数据框上使用lapply和sapply

 因子和水平

x<-c(5,12,13,12)

xf<-factor(x)    因子xf包含有三个水平5,12,13 , 因子长度length(xf)是数据的长度为4,即c(1,2,3,2),而不是因子的个数

tapply(x,f,g) 函数,  其中x是向量,f是因子,g是函数。意思是对因子f的每个水平调用函数g。

如ages<-c(25,26,27,55)  aff<-c(“A”,”A”,”B”,”C”)  tapply(ages,aff,mean) ,先对ages按照aff分组,然后每组求平均。

split()函数 ,将向量根据因子进行分组。 基本形式为split(x,f)  ,返回值为list类型,x为向量或者数据框,f为因子或者因子的列表。, 如split(d$income,list(d$gender,d$over25))  其中d为一个数据框,包含有列income,gender,over25.

by()函数和tapply相似,区别是by可以作用于数据框,而不仅仅是向量。如by(d,d$gender,function(m) lm(m[,2]~[,3])) 表示对数据框d,先按照gender因子分组,然后对每组进行回归分析。

表的操作:fl<-list(c(5,12,13,12,13),c(“a”,”bc”,”a”,”bc”,”a”))   table(fl) 将生成两个因子的频数表。因此table的第一个参数为因子或者因子的列表 , 列表也可以是三维的或1维的。

table元素的访问也可以像矩阵一样通过下标来访问。另外可以通过addmargins(tbl)来获得该表的边际值。

aggregate()汇总函数,实例:aggregate(aba[,-1],list(aba$Gender),median) , 表示取数据框第一列以外的其他列,按照Gender分组后,对每一列(每个变量)调用median函数。

cut()函数,该函数给定一个数据向量x,一个区间向量b,确定x中每个元素将落入哪个区间。返回区间的序号向量。

如z<-rnorm(10) bin<-seq(from=0.0,to=1.0,by=0.1)  cut(z,bin,labels=F) 即计算z的每个值位于bin的哪个区间。

 R语言编程结构

for (n in x) {print(n)}

i<-10 while(i>0) { i <- i -1}

while(TRUE) { i <- i +1  if (i<0) break}

repeat {i <-i-1  if(i<0) break}

直接进行下一次循环,用next语句

if( x== 4) { x<- 1 } else{ x<-2}

算术运算及逻辑运算符:

+,-,*,/,^,%%(模运算),%/%(整数除法),==,<=,>=,&&(标量逻辑与操作),||,&(向量逻辑与操作),|,!

数学函数

exp(),log(),log10(),seqrt(),abs(),sin(),cos(),min(),max(),which.min(),which.max(),pmin(),pmax(),sum(),prod(), cumsum(),cumprod(),round(),floor(),ceiling(), factorial()

微分: D(expression(exp(x^2)),”x”) , 给出微分形式

积分: integrate(function(x) x^2,0,1) —>0.333

统计分布函数: [dpqr][norm|chisq|binom] 等函数  d概率密度函数,p累计分布,q对应分布的分位数,r随机生成函数

排序:sort(x) , order(x) , order函数返回的排序后的索引向量,可用于对数据框进行排序。 rank(x) 返回每个元素在向量中的排名序号。

向量点积:  crossprod(1:3,c(5,12,13))   注意这个名字有些问题,计算的是点积(1*5+2*12+3*13)而不是叉积。

矩阵乘法: %*%

解线性方程组: solve(a,b) ,  a是系数矩阵,b是方程右边的值。 如果调用solve时不指定b,则返回矩阵a的逆矩阵。

更多函数: t() 矩阵转置, qr() 矩阵QR分解, chol() Cholesky分解 , det() 矩阵行列式的值, eigen()矩阵的特征值和特征向量

diag() 从方阵中提出对角矩阵 sweep() 数值分析批量运算符

sweep举例:sweep(x,1,c(1,2,3),”+”) 表示对矩阵x的1,2,3行分别加上数值1,2,3 , 第二个参数1表明是对行进行操作。

集合运算: union(x,y)并集 , intersect(x,y) 交集, setdiff(x,y)集合的差, seqequal(x,y)检验集合是否相等 c %in% x 判断x是否在集合x里面

S3类

寻找泛型函数:methods(print)  列出所有的print函数,标星的为不在默认命名空间中的函数,可以通过getAnywhere()来找到这些函数,然后使用命名空间限定符访问他们。getAnywhere(print.ABC)  , 如果找到会列出其所在的命名空间(假设为util),然后利用util:::print.ABC() 来调用这个函数。

查找一个类中所有的函数可以利用 methods(class=”lm”)后面的lm 为类名。

编写一个s3类,只需给定类名即可,class(alist)<-className  为类添加方法:

print.className<-function() 这样,print(className)即会调用到这个方法。

继承: 给定类名时,给出的是一个向量而不是一个名字,前面的类继承后面的类。

如: class(x)<-c(subclass,parentClass)

这样父类定义的方法,子类也可以使用。

S4类

s3类有安全隐患,因为有时候成员变量写错了,s3并不会给提示。S4类加强了这类检查。语法上也有不同。

定义类: setClass()

创建对象 : new()

引用成员变量 @

实现泛型函数: setMethod()

声明泛型函数: setGeneric()

对象管理

列出所有的对象: ls()

删除对象: rm() , 删除所有对象: rm(list=ls())

保存对象: save(x,”xfile”) 把x保存在文件xfile中,后面可以用load(“xfile”)装载这个对象

查看对象内部结构:class(x) mode(x) names(x) attributes(x) unclass(x) str(x) edit(x)  edit函数可以看到该对象的所有数据,看起来最有用了。

exists(“x”) 查看对象是否存在 其中x为对象名字,需要用引号

读文件

scan()函数 , 读取文本文件,缺省情况下读取文件中以空格分割的所有浮点数值。 即scan(“a.txt”) , 返回一个向量

如果文件中包含非数值,可以字符串形式读入,scan(“a.txt”,what=””) , 返回所有已空格分割的字符串向量。

如果指定分隔符为换行,scan(“a.txt”,what=””,sep=”\n”) 返回以换行分割的字符串向量

readline() 可以从键盘读取单行数据,如age<-readline(“input the age:”)

如果数据为表格形式:因为有表头,用scan不能读入,可以用read.table()函数。

如果全是数据,且为矩阵形式,可以用matrix+ scan读入矩阵,x<-matrix(scan(“x”),nrow=5,byrow=T)

readLines(“a.txt”) 可以读取文本文件,每一行当做一个字符串。等价于scan中指定分隔符为换行

readLines也可以一次读取一行:如下:
aa<-file(“a.txt”,”r”)

while(T){

rl<-readLines(aa,n=1)
if(length(rl) ==0) {print(“feof”)   break}

else{print(rl)}
}

seek()函数可以移动文件指针。

read.table和scan也可以以网站地址作为参数,一次来读取网络上的数据。read.table(“http://xx.xx.xx”,head=T)

写文件

write.table() 把数据框输出到文件

矩阵也可以直接利用write.table写入文件,不过要声明row.names=F,col.names=F ,即不输出行名和列名

cat也可以用来写文件, cat(“def\n”,file=”xx”,append=T) 追加的时候要加上append参数

cat可以一次写多个值,cat(file=”xx”,”a”,”b”,”c”)

writeLines()

ff<-file(“www”,”w”)

writeLines(c(“abc”,”def”,”gg”),ff)

close(ff)

将生成一个三行的文件。

获取文件目录信息

file.info()

dir() 列出指定目录中所有的文件,可选参数recursive=T可递归列出所有的子目录文件

file.exists()判断文件是否存在

getwd() setwd()获得和设置当前工作目录

文件copy等

file.copy(from, to, overwrite = recursive, recursive = FALSE,
               copy.mode = TRUE, copy.date = FALSE)
file.rename(from, to)
file.remove(...)

字符串操作

grep()  grep(“he”,c(“hello”,”world”,”hhe”,”haha”))  —>返回c(1,3) ,如果没有匹配的,则返回一个空向量

nchar(“abc”)  —>3   返回字符串的长度, 注意如果参数不是字符串,返回值可能无法预料,如nchar(NA)=2

paste(“a”,”b”,”c”)  —>”abc”  拼接字符串, 可以指定sep=”” ,指定拼接是的分隔符

把一个字符串向量拼接成单个字符串,使用collapse参数。如:

aa=c("hello","world")
paste(aa,collapse=" ")
#> [1] "hello world"
  • 抽取字符串,使用stringr::str_extract , 如下所示
aa=c("markdown/p123.html","markdown/p345.html","markdown/p789.html")
bb=stringr::str_extract(aa,"p\\d+")
bb
#> [1] "p123" "p345" "p789"
sprintf("%s.md",bb)
#> [1] "p123.md" "p345.md" "p789.md"
  • 替换
stringi::stri_replace_all_regex("aaa-bb","(a+)\\-(b+)","$1+$2")
#> [1] "aaa+bb"

sprintf(“aa is %d”,4)  生成格式化的字符串

substr(x,start,stop) 返回字符串x的start:stop上的子字符串

strsplit(x,split) 根据split将x分割成若干字符串,返回字符串组成的列表

regexpr(“he”,”wwwhe”)  返回he在后面字符串中出现的位置,此例返回4

gregexpr , 意义同上面的函数,只是返回所有的位置,而不仅仅是第一个位置

上面的grep,regexpr,gregexpr等函数,第一个参数可以是正则表达式

  • 字符串替换 sub/gsub可以用来替换字符串中的给定模式。调用方式为 sub(pattern,replacement,x)
aa=c("hello","world","!")
bb=sub('l',"L",aa)
bb
#> [1] "heLlo" "worLd" "!"
bb=gsub('l',"L",aa)
bb
#> [1] "heLLo" "worLd" "!"
  • 解析网页时指定编码

library(XML)
doc<-htmlTreeParse(url,useInternalNodes=T,encoding=”gb2312″)

如果是utf8编码的网页,则不需要后面的两个参数.

全局参数

获得所有的参数使用options(), 设置某个参数,比如stringsAsFactors 使用options(stringAsFactors = FALSE)

下面是所有的参数,供参考

options()
#> $add.smooth
#> [1] TRUE
#> 
#> $bitmapType
#> [1] "cairo"
#> 
#> $browser
#> [1] "xdg-open"
#> 
#> $browserNLdisabled
#> [1] FALSE
#> 
#> $CBoundsCheck
#> [1] FALSE
#> 
#> $check.bounds
#> [1] FALSE
#> 
#> $citation.bibtex.max
#> [1] 1
#> 
#> $continue
#> [1] "+ "
#> 
#> $contrasts
#>         unordered           ordered 
#> "contr.treatment"      "contr.poly" 
#> 
#> $defaultPackages
#> [1] "datasets"  "utils"     "grDevices" "graphics"  "stats"    
#> 
#> $demo.ask
#> [1] "default"
#> 
#> $deparse.cutoff
#> [1] 60
#> 
#> $device
#> function (width = 7, height = 7, ...) 
#> {
#>     grDevices::pdf(NULL, width, height, ...)
#> }
#> <environment: namespace:knitr>
#> 
#> $device.ask.default
#> [1] FALSE
#> 
#> $digits
#> [1] 7
#> 
#> $dvipscmd
#> [1] "dvips"
#> 
#> $echo
#> [1] FALSE
#> 
#> $editor
#> [1] "vi"
#> 
#> $encoding
#> [1] "native.enc"
#> 
#> $example.ask
#> [1] "default"
#> 
#> $expressions
#> [1] 5000
#> 
#> $help.search.types
#> [1] "vignette" "demo"     "help"    
#> 
#> $help.try.all.packages
#> [1] FALSE
#> 
#> $HTTPUserAgent
#> [1] "R (3.2.2 x86_64-pc-linux-gnu x86_64 linux-gnu)"
#> 
#> $internet.info
#> [1] 2
#> 
#> $keep.source
#> [1] FALSE
#> 
#> $keep.source.pkgs
#> [1] FALSE
#> 
#> $knitr.in.progress
#> [1] TRUE
#> 
#> $locatorBell
#> [1] TRUE
#> 
#> $mailer
#> [1] "mailto"
#> 
#> $max.print
#> [1] 99999
#> 
#> $menu.graphics
#> [1] TRUE
#> 
#> $na.action
#> [1] "na.omit"
#> 
#> $nwarnings
#> [1] 50
#> 
#> $OutDec
#> [1] "."
#> 
#> $pager
#> [1] "/usr/lib/R/bin/pager"
#> 
#> $papersize
#> [1] "a4"
#> 
#> $pdfviewer
#> [1] "/usr/bin/xdg-open"
#> 
#> $pkgType
#> [1] "source"
#> 
#> $printcmd
#> [1] "/usr/bin/lpr"
#> 
#> $prompt
#> [1] "> "
#> 
#> $repos
#>     CRAN 
#> "@CRAN@" 
#> 
#> $rl_word_breaks
#> [1] " \t\n\"\\'`><=%;,|&{()}"
#> 
#> $scipen
#> [1] 0
#> 
#> $show.coef.Pvalues
#> [1] TRUE
#> 
#> $showErrorCalls
#> [1] TRUE
#> 
#> $show.error.messages
#> [1] TRUE
#> 
#> $show.signif.stars
#> [1] TRUE
#> 
#> $str
#> $str$strict.width
#> [1] "no"
#> 
#> $str$digits.d
#> [1] 3
#> 
#> $str$vec.len
#> [1] 4
#> 
#> 
#> $str.dendrogram.last
#> [1] "`"
#> 
#> $stringsAsFactors
#> [1] TRUE
#> 
#> $texi2dvi
#> [1] "/usr/bin/texi2dvi"
#> 
#> $tikzMetricsDictionary
#> [1] "p4912-tikzDictionary"
#> 
#> $timeout
#> [1] 60
#> 
#> $ts.eps
#> [1] 1e-05
#> 
#> $ts.S.compat
#> [1] FALSE
#> 
#> $unzip
#> [1] "/usr/bin/unzip"
#> 
#> $useFancyQuotes
#> [1] FALSE
#> 
#> $verbose
#> [1] FALSE
#> 
#> $warn
#> [1] 0
#> 
#> $warning.length
#> [1] 1000
#> 
#> $width
#> [1] 65


本文地址: http://www./wordpress/archives/4912 转载请注明


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多