rcall命令——Stata中的R接口

rcall命令——Stata中的R接口

在此之前的一篇文章《RStata包——R中的Stata接口》中讲述了如何在R中运行Stata命令并实现数据传递。而这篇文章正好相反,rcall命令可以实现在Stata中运行R代码并完成数据直接的传递。这个命令是Stata大佬Haghish编写的。

rcall命令的安装

1
2
3
ssc install rcall
/* 或者 */
github install haghish/rcall, replace

rcall的用法

设置r命令的路径

rcall包中包含Microsoft Windows,Mac和Linux上的R的默认路径,但是如何你的安装路径和它默认的不一致就要自己设置了,注意这个设置是永久性的。

注意对于Mac来说,这个路径是这样查找的,在终端输入:

1
which r

结果是/usr/local/bin/r,这就是我电脑上R的路径。

rcall的基本用法

1
2
3
4
5
6
7
8
9
10
11
12
* 查看历史命令:打开Rhistory.do
rcall history
* 设置R的路径
rcall setpath "/usr/local/bin/r"
* 清空R内存
rcall clear
* 运行单行命令
rcall: library(messyr)
* 运行多行命令
rcall:
library(messyr)
end

一些重点用法

将R的对象传递给Stata

这个是通过把R对象存储在返回值中实现的。

数值对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14

. rcall: a <- 100

. ret list

scalars:
r(rc) = 0
r(a) = 100

. di r(a)
100

. rcall: a
[1] 100

字符串对象

1
2
3
4
5
6
7
8
9
10
11
12
13
. rcall: str <- "Hello world"

. ret list

scalars:
r(rc) = 0
r(a) = 100

macros:
r(str) : "Hello world"

. di r(str)
Hello world

字符串向量

1
2
3
4
5
6
7
8
9
10
11
12
13
. rcall: str <- c('Hello', 'world')

. ret list

scalars:
r(rc) = 0
r(a) = 100

macros:
r(str) : ""Hello" "world" "

. di r(str)
"Hello" "world"

数值向量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
. rcall: v <- c(1, 2, 3, 4, 5)

. ret list

scalars:
r(rc) = 0
r(a) = 100

macros:
r(str) : ""Hello" "world" "
r(v) : "1 2 3 4 5"

. di r(v)
1 2 3 4 5

矩阵

1
2
3
4
5
6
7
8
. rcall: A = matrix(1:6, nrow = 2, byrow = T)

. mat list r(A)

r(A)[2,3]
c1 c2 c3
r1 1 2 3
r2 4 5 6

列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
. rcall: mylist = list(a = c(1:10))

. ret list

scalars:
r(rc) = 0
r(a) = 100

macros:
r(mylist_a) : "1 2 3 4 5 6 7 8 9 10"
r(str) : ""Hello" "world" "
r(v) : "1 2 3 4 5"

matrices:
r(A) : 2 x 3

. di r(mylist_a)
1 2 3 4 5 6 7 8 9 10

逻辑变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
. rcall: l <- T

. ret list

scalars:
r(rc) = 0
r(a) = 100

macros:
r(mylist_a) : "1 2 3 4 5 6 7 8 9 10"
r(l) : "TRUE"
r(str) : ""Hello" "world" "
r(v) : "1 2 3 4 5"

matrices:
r(A) : 2 x 3

. di r(l)
TRUE

空对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
. rcall: n <- NULL

. ret list

scalars:
r(rc) = 0
r(a) = 100

macros:
r(mylist_a) : "1 2 3 4 5 6 7 8 9 10"
r(l) : "TRUE"
r(str) : ""Hello" "world" "
r(n) : "NULL"
r(v) : "1 2 3 4 5"

matrices:
r(A) : 2 x 3

. di r(n)
NULL

将Stata的对象传递给R

全局宏

1
2
3
4
. global a 99

. rcall: (a <- $a)
[1] 99

标量

1
2
3
4
. scala a = 50

. rcall: (a <- st.scalar(a))
[1] 50

矩阵

1
2
3
4
5
6
7
8
9
10
. mat A = (1, 2 \ 3, 4)

. mat B = (96, 96 \ 96, 96)

. rcall: (C <- st.matrix(A) + st.matrix(B))
c1 c2
r1 97 98
r2 99 100
* 同时这个C也会存在于Stata的返回值中
mat list r(C)

把Stata变量传递给R

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
. clear all

. sysuse auto, clear
(1978 Automobile Data)

. rcall: dep <- st.var(price)

. rcall: pre <- st.var(mpg)

. rcall: lm(dep ~ pre)

Call:
lm(formula = dep ~ pre)

Coefficients:
(Intercept) pre
11253.1 -238.9

一些函数:

函数 含义
st.scalar(name) passes a scalar to R
st.matrix(name) passes a matrix to R
st.var(varname) passes a numeric or string variable to R
st.data(filename) passes Stata data to R. without filename, the currently loaded data is used.
st.load(dataframe) loads data from R dataframe to Stata

将Stata数据集传递给R读取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
. rcall: install.packages("readstata13", repos="http://cran.uk.r-project.org")

The downloaded binary packages are in
/var/folders/9p/6f00xrjj4gzd58nh54ddrvqr0000gn/T//Rtmpw5EsnM/downloaded_packages

. rcall: data <- st.data(/Applications/Stata/ado/base/a/auto.dta)

. rcall: dim(data)
[1] 74 12

* 下面的代码可以实现一样的功能

. sysuse auto, clear
(1978 Automobile Data)

. rcall: data <- st.data()

将R的数据集传递给Stata

1
2
3
4
5
6
7
8
9
10
11
12
. clear all

. rcall: st.load(cars)

. list in 1/2

+--------------+
| speed dist |
|--------------|
1. | 4 2 |
2. | 4 10 |
+--------------+

注意事项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
. rcall: head(cars$speed)
speed dist
1 4 2
2 4 10
3 7 4
4 7 22
5 8 16
6 9 10

. rcall: a.name <- 'anything'

. ret list

scalars:
r(rc) = 0
r(a) = 50

macros:
r(mylist_a) : "1 2 3 4 5 6 7 8 9 10"
r(l) : "TRUE"
r(str) : ""Hello" "world" "
r(a_name) : "anything"
r(n) : "NULL"
r(v) : "1 2 3 4 5"
r(pre) : "22 17 22 20 15 18 26 20 16 19 14 14 21 29 16 22 22 24 1.."
r(dep) : "4099 4749 3799 4816 7827 5788 4453 5189 10372 4082 1138.."

matrices:
r(C) : 2 x 2
r(A) : 2 x 3

. di r(a_name)
anything
# R, Stata

评论

程振兴

程振兴 @czxa.top
截止今天,我已经在本博客上写了658.8k个字了!

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×