下载地址:http://r2clr.codeplex.com/
library(rClr)
clrLoadAssembly('c:/path/to/myassembly.dll')
myObj <-clrNew('MyNamespace.MyClass,MyAssemblyName')
clrCall(myObj, 'SayHelloWorld')
data.frame是一个list对象
#include
SEXP df_fun(SEXP df)
{
int i, len = Rf_length(df);
SEXP result;
PROTECT(result = NEW_CHARACTER(len));
for (i = 0; i < len; ++i)
switch(TYPEOF(VECTOR_ELT(df, i))) {
case INTSXP:
SET_STRING_ELT(result, i, mkChar("integer"));
break;
case REALSXP:
SET_STRING_ELT(result, i, mkChar("numeric"));
break;
default:
SET_STRING_ELT(result, i, mkChar("other"));
break;
};
UNPROTECT(1);
return result;
}
然后使用 R CMD SHLIB来编译df_fun.c文件成库。
> dyn.load("df_fun.so")
> df=data.frame(x=1:5, y=letters[1:5],z=pi, stringsAsFactors=FALSE)
> .Call("df_fun", df)
[1] "integer""other" "numeric"
在Rdefines.h文件中定义的宏GET_CLASS, GET_ATTR等,可以用来访问数据框的各种属性。
hs <- help(survey)
tools:::Rd2txt(utils:::.getHelpFile(as.character(hs)))
Student Survey Data
Description:
This data frame containsthe responses of 237 Statistics I
students at the University of Adelaide to a number of questions.
Usage:
survey
Format:
The components of the data frame are:
'Sex' The sex of thestudent. (Factor with levels '"Male"' and
'"Female"'.)
'Wr.Hnd' span (distancefrom tip of thumb to tip of little finger
of spread hand) of writing hand, in centimetres.
'NW.Hnd' span ofnon-writing hand.
'W.Hnd' writing hand ofstudent. (Factor, with levels '"Left"' and
'"Right"'.)
'Fold' "Fold yourarms! Which is on top" (Factor, with levels '"R
on L"', '"L on R"', '"Neither"'.)
'Pulse' pulse rate ofstudent (beats per minute).
'Clap' 'Clap yourhands! Which hand is on top?' (Factor,with
levels '"Right"', '"Left"', '"Neither"'.)
'Exer' how often thestudent exercises. (Factor, with levels
'"Freq"' (frequently), '"Some"','"None"'.)
'Smoke' how much the student smokes. (Factor, levels'"Heavy"',
'"Regul"' (regularly), '"Occas"' (occasionally),'"Never"'.)
'Height' height of thestudent in centimetres.
'M.I' whether the studentexpressed height in imperial
(feet/inches) or metric (centimetres/metres) units. (Factor,
levels '"Metric"', '"Imperial"'.)
'Age' age of the student inyears.
References:
Venables, W. N. and Ripley,B. D. (1999) _Modern Applied
Statistics with S-PLUS._ Third Edition. Springer.
tempdir()
[1]"C:\\Users\\sliu\\AppData\\Local\\Temp\\RtmpgJtwWX"
函数的Gradient向量定义如下:
Hessian矩阵定义如下:
library(pracma)
dummy <- function(x) {
z<- x[1]; y <- x[2]
rez<- (z^2)*(y^3)
rez
}
grad(dummy, c(1,2))
[1] 16 12
hessian(dummy, c(1,2))
[,1] [,2]
[1,] 16 24
[2,] 24 12
sos包是专门用于查找R语言帮助信息的包,远比基础的help函数强大,查找范围包括所有的R语言包,比如搜索下面的信息,搜索结果会以网页的形式返回,其他更高级的使用方法请查看sos包的帮助文档。
library(sos)
???"Dickey-Fuller"
比如文件data.txt的内容如下,
"Year" "Jan" "Feb" "Mar""Apr" "May" "Jun" "Jul" "Aug""Sep" "Oct" "Nov" "Dec"
2009 -41 -27 -25 -31 -31 -39 -25 -15 -30-27 -21 -25
2010 -41 -27 -25 -31 -31 -39 -25 -15 -30-27 -21 -25
2011 -21 -27 -2 -6 -10 -32 -13 -12 -27 -30-38 -29
#我只希望读取前七列的数据,可以把不需要的列的类型设置为NULL
read.table("data.txt", colClasses =c(rep("integer", 7), rep("NULL", 6)), header = TRUE)
Year Jan Feb Mar Apr May Jun
1 2009 -41 -27 -25 -31 -31 -39
2 2010 -41 -27 -25 -31 -31 -39
3 2011 -21 -27 -2 -6 -10 -32
对如下向量,实现并列排名,即如果并列第一名有两个,则下一个是第三名。
x <- c(0.64, 0.64, 0.63, 0.62, 0.62, 0.62, 0.61, 0.6, 0.6, 0.58)
rank(-x, ties="min")
#[1] 1 1 3 4 4 4 7 8 8 10
df <- data.frame(ids=c(1,1,2,2,3),x=1:5,y=letters[1:5])
split(df, df$ids)
# $`1`
# ids x y
# 1 1 1 a
# 2 1 2 b
#
# $`2`
# ids x y
# 3 2 3 c
# 4 2 4 d
#
# $`3`
# ids x y
# 5 3 5 e
imax<-c(10)
#字符形式的进度条
pb <- txtProgressBar(min = 0, max = imax, style = 3)
for(i in 1:imax) {
Sys.sleep(1)
# 更新进度
setTxtProgressBar(pb, i)
}
cat("\n")
效果:
dat<-c(5,7,4,6,4,3,55,6,7,5,4,3,33,44,5,2,33,22)
hist (dat,freq=FALSE)
d<-density(dat)
lines(d, col="red", lwd=2)
#get density function
dd<-approxfun(d$x, d$y)
#plot results
abline(v=mean(dat), lty=2)
points(0:60, dd(0:60), cex=1.2, pch=20, col="blue")
#有很多种方法生成乘法口诀表,这里提供两例,第一例使用sapply和paste0函数;第二例使用#outer函数
例一:
A <- 1:9
B <- 1:9
FunOut <- function(x)
{
FunIn <- function(y)
{
paste0(x, 'X',y,'=',x * y)
}
sapply(B, FunIn)
}
AB <- sapply(A,FunOut)
例二:
outer(1:9, 1:9, function(X, Y) noquote(sprintf("%dX%d=%d",X, Y, X*Y)))
## data
N <- 10
dnow <- data.frame(x=1:N, y=runif(N), labels=paste("This is\nobservation ",1:N))
## make margins wide
par(mfrow=c(1,1), mar=c(10,10,6,4))
## plot without axix labels or ticks
with(dnow, plot(x,y, xaxt="n", xlab=""))
## the positions we ant to plot
atn <- seq(1,N,3)
## the label for these positions
lab <- dnow$labels[atn]
## plot the axis, but do not plot labels
axis(1, at=atn, labels=FALSE)
## plot labels
text(atn, ## x position
par("usr")[3]-.05, ## position of the low axis
srt=45, ## angle
labels=lab, ##labels
xpd=TRUE, ## allowsplotting outside the region
pos=2)
## par("usr")[3]
a<-c(1,1,2,2,2,3,3,3,5,5,5,6,6,6)
rle(a)
#Run Length Encoding
# lengths: int [1:5] 2 3 3 3 3
# values : num [1:5] 1 2 3 5 6
结果解释,上面是计数,下面是字符,1两个,2三个,3三个,5三个,6三个
parse函数可以解析字符串形式的表达式,并转化为expression类型,eval函数可以计算expression类型的表达式:
A <- 1
B <- 2
for(i in c('/','+','-','*'))
{
S <- paste0('A', i,'B')
print(S)
E <- parse(text = S)
print(E)
print(eval(E))
}
# [1] "A/B"
# expression(A/B)
# [1] 0.5
# [1] "A+B"
# expression(A+B)
# [1] 3
# [1] "A-B"
# expression(A-B)
# [1] -1
# [1] "A*B"
# expression(A*B)
# [1] 2