# xlwings with R and Julia
虽然xlwings是一个纯Python包,但是有一些跨语言包允许从/与其他语言相对直接使用。 但是,这意味着除了R或Julia之外,你总是需要安装带xlwings的Python。 我们推荐[Anaconda](https://store.continuum.io/cshop/anaconda/)发行版,另见[安装](installation.md)。
## R
R指令适用于Windows,但在Mac上相应的工作方式除外,目前不支持将R函数作为用户定义函数调用(但是`RunPython`有效,请参阅[使用“RunPython调用Python”](vba.html#运行蟒蛇))。
步骤:
* 安装 R 和 Python
* Add `R_HOME` environment variable to base directory of installation, .e.g `C:\Program Files\R\R-x.x.x`
* Add `R_USER` environment variable to user folder, e.g. `C:\Users\<user>`
* 添加`C:\Program Files\R\R-x.x.x\bin` 到 `PATH`
* 重新启动Windows,因为添加环境变量!
### R语言的简单函数
我们想要从Excel访问的原始R函数(保存在`r_file.R`中):
~~~
myfunction <- function(x, y){
return(x * y)
}
~~~
Python包装器代码:
~~~
import xlwings as xw
import rpy2.robjects as robjects
# 您可能想要使用某个相对路径或将文件放在R的当前工作目录中
robjects.r.source(r"C:\path\to\r_file.R")
@xw.func
def myfunction(x, y):
myfunc = robjects.r['myfunction']
return tuple(myfunc(x, y))
~~~
导入此函数后(请参见:[VBA: 用户自定义函数 (UDFs)](udfs.md)),它将从Excel中作为udf提供。
### R语言的数组函数
我们想要从Excel访问的原始R函数(保存在`r_file.R`中):
~~~
array_function <- function(m1, m2){
# 矩阵乘法
return(m1 %*% m2)
}
~~~
Python包装器代码:
~~~
import xlwings as xw
import numpy as np
import rpy2.robjects as robjects
from rpy2.robjects import numpy2ri
robjects.r.source(r"C:\path\to\r_file.R")
numpy2ri.activate()
@xw.func
@xw.arg("x", np.array, ndim=2)
@xw.arg("y", np.array, ndim=2)
def array_function(x, y):
array_func = robjects.r['array_function']
return np.array(array_func(x, y))
~~~
导入此函数后(请参阅:[VBA: 用户自定义函数 (UDFs)](udfs.md)),它将作为UDF从Excel中获得。
## Julia语言
步骤:
* 安装 Julia 和 Python
* 从交互式Julia解释器运行`Pkg.add("PyCall")`
然后可以使用以下语法从Julia调用xlwings(冒号负责自动类型转换):
~~~
julia> using PyCall
julia> @pyimport xlwings as xw
julia> xw.Book()
PyObject <Book [Workbook1]>
julia> xw.Range("A1")[:value] = "Hello World"
julia> xw.Range("A1")[:value]
"Hello World"
~~~