当您想通过RExcel在VBA中使用R函数时,必须使用
RInterface.RRun "..."
然后,如果你想定义你自己的R函数,你可以简单地
RInterface.RRun "y <- function(x) { ... }"
如果y
由多个命令行组成,则可以使用;
分隔每一行,就像在R环境中所做的那样。
但是。。。如果你的y
函数很长怎么办?
一个20~30行的R函数在VBA中用这种方式编写是非常困难的;VBA语句的长度是有限制的。
那么:我该怎么包?
这里有一个相当长的R函数的例子:你能告诉我如何使用RExcel放入VBA吗?
bestIV <- function(dT, IVTS.t, Spot, r) {
b <- r
xout <- seq(0, max(T), dT)
sfm <- matrix(NA, nrow = length(K), ncol = length(xout))
for(i in 1:length(K)) {
sfm[i,] <- approx(x = T, y = IVTS.t[i,], xout = xout, rule = 2)$y
}
sfm[,1] <- sfm[,1] + sfm[,2] - sfm[,3]
rownames(sfm) <- K
colnames(sfm) <- xout
Option <- matrix(NA, nrow = length(K), ncol = length(xout))
for(i in 1:length(K)) {
for(j in 1:length(xout)) {
TypeFlag <- ifelse(K[i] < Spot, 'p', 'c')
Option[i,j] <- GBSOption(TypeFlag = TypeFlag, S = Spot, X = K[i],
Time = xout[j] / 365, r = r, b = b,
sigma = sfm[i,j] / 100)@price
}
}
rownames(Option) <- K
colnames(Option) <- xout
dP <- (cbind(0, -t(apply(X = Option, MARGIN = 1, FUN = diff))) / Option)[,-(1:2)]
dV <- dP / dT
min.V <- which(dV == min(dV), arr.ind = TRUE, useNames = TRUE)
Strike <- as.numeric(dimnames(min.V)[1])
Maturity <- as.numeric(unlist(dimnames(dV)[2]))[min.V[2]]
Days <- dT
Mat <- c(dV[which(dV == min(dV))], Strike, Maturity, Days)
names(Mat) <- c('Value', 'Strike', 'Maturity', 'Days')
return(Mat)
}
谢谢,
将你的R代码放在你的spreadhseet中(在一系列单元格中),然后使用这个函数:
R接口。从量程范围运行代码
执行工作表上区域中的命令(允许使用为与R交互执行准备的命令,以便在宏代码中运行)
您正在将字符串作为参数传递给VBA函数。因此,您的问题简化为"如何在VBA中连接字符串"。
答案是使用级联运算符&
,如下所示:
"a" & "b"
假设你有一个R函数:
y <- function(x, a, b){
return(x)
}
然后您可以在VBA中执行此操作:
RInterface.RRun "y <- function(x, a, b) {" &
"return(x)" &
"}"