我正在使用roxygen2作为记录我的R包的工具,我发现roxygen2中有一个@references标签,但这似乎只接受自由格式文本.我找到了一些关于roxygen的演示文稿,其中有@bibliograph和@cite标签,但我是否认为roxygen2中没有这样的东西?
我应该以某种方式从bibtex文件中取出引用并在@references标记之后直接用适当的格式手动编写它们,还是有更聪明的方法呢?在多个函数/ rd文件中,我需要引用大约七篇不同的文章.
我有一个R包,它使用大量的Fortran子程序来进行递归线性代数计算的嵌套循环(严重依赖于BLAS和LAPACK例程).作为Fortran的接口,我使用了.Fortran函数.我刚刚阅读了Jonathan Callahan关于使用的博文,.Call而不是.C用C/C++编写的子程序,它让我觉得.Call在使用Fortran子程序时使用接口更好,通过在C中编写一个简单的包装然后调用Fortran子程序?
如上所述,我的Fortran代码非常简单,因为我只使用double或integer类型的多维数组.但是我已经知道我必须在R端编写相当多的检查,以确保一切都不会崩溃,因为我不小心忘记将某些矩阵的存储模式更改为整数或某些矩阵的维度已更改等.
子程序写为F90/95.
我正在开发一个R包的主要升级,作为更改的一部分,我想开始使用S3方法,所以我可以使用通用的绘图,摘要和打印功能.但我想我并不完全确定我理解为什么以及何时一般使用泛型函数.
例如,我目前有一个名为logLikSSM的函数,它计算状态空间模型的对数似然.而不是使用这个函数,我可以使函数logLik.SSM或类似的东西,因为在R中有泛型函数logLik.这样做的好处是logLik写入比logLikSSM短,但实际上还有其他任何一点.这个?
类似的情况,在stats包中有一个名为simulate的泛型函数,所以理论上我可以使用它而不是simulateSSM.但是现在模拟函数的描述告诉我该函数用于"模拟响应",但我的函数实际上模拟了隐藏状态,因此它实际上不适合模拟函数的描述.所以在这种情况下我不应该使用通用函数吗?
如果这个问题在这里太模糊,我道歉.
我有一个R包当前使用S3类系统,有两个不同的类和几个通用S3函数的方法,如plot(logLik和update模型公式更新).由于我的代码if/else因所有有效性检查和结构而变得更加复杂,因为没有基于两个参数的继承或调度S3,我开始考虑将我的包转换为S4.但后来我开始阅读S3对比的优点和缺点,S4我不再那么肯定了.我发现R-bloggers博客文章关于S3 vs S4的效率问题,就像5年前那样,我现在测试了同样的事情:
library(microbenchmark)
setClass("MyClass", representation(x="numeric"))
microbenchmark(structure(list(x=rep(1, 10^7)), class="MyS3Class"),
new("MyClass", x=rep(1, 10^7)) )
Unit: milliseconds
expr
structure(list(x = rep(1, 10^7)), class = "MyS3Class")
new("MyClass", x = rep(1, 10^7))
min lq median uq max neval
148.75049 152.3811 155.2263 159.8090 323.5678 100
75.15198 123.4804 129.6588 131.5031 241.8913 100
Run Code Online (Sandbox Code Playgroud)
所以在这个简单的例子中,S4实际上有点快.然后我读了关于使用vs的问题,这非常有利于.特别是@ joshua-ulrich的回答让我怀疑,正如它所说的那样S3S4S3S4
任何插槽更改都需要完整的对象副本
如果我考虑我的情况,在优化模型的对数可能性时,我在每次迭代中更新我的对象,这感觉就像一个大问题.经过一些谷歌搜索后,我发现John Chambers发布 …
不幸的是,像(f+g)(3)f和g这两个都是一元函数的东西在R中不起作用.因此,我尝试以下列方式重载"+"运算符以获得一元函数:
"+.function" = function(e1, e2){
return(function(x) e1(x) + e2(x))
}
Run Code Online (Sandbox Code Playgroud)
但如果我尝试使用它,这什么都不做.代码
a = function(x) 2*x
(a+a)(2)
Run Code Online (Sandbox Code Playgroud)
产生相同的错误,如果+.function没有定义.
通过一段时间的游戏,我发现事实上有可能以这种方式添加函数:如果函数是引用类的成员函数,这是有效的!即,以下代码(连同上面的"+"定义)
clsA = setRefClass("clsA",
methods = list(
b = function(x) 2*x
))
inst_a = clsA$new()
(inst_a$b + inst_a$b)(2)
Run Code Online (Sandbox Code Playgroud)
返回"8"(如预期的那样).因此,我已经为我的问题找到了某种解决方法.现在我的问题是:
这种奇怪行为的原因是什么?为什么不+.function关心"通常"功能而是关注类成员函数?有谁知道如何将操作员"扩展"到通常的功能?
我目前使用BLAS函数DSYMM来计算Y = AX,然后对DGEMM YA',但我不知道是否有计算所述矩阵积AXA的一些更有效的方式Ť,其中A是一个任意的n×n矩阵,X是一个对称n×n矩阵?
我正在使用graphNEL来自gRbase和Rgraphviz绘图的对象,并且想要在绘图时以不同(指定)颜色为图形的节点着色.例如,我怎么能绘制此图与a和b蓝色和c和d红色的吗?
library(Rgraphviz)
library(gRbase)
mygraph = dag(~a:c + b:c + b:d)
plot(mygraph)
Run Code Online (Sandbox Code Playgroud)

我无法理解如何使用嵌套函数调用和参数评估.
这是一个简单的例子.我有一个topfunction带有一个数字参数的顶级函数.在topfunction我内部调用另一个函数lowerfunction,该参数是对内部定义的函数的调用lowerfunction.
topfunction<-function(x){
lowerfunction(myfun(first=x[1],second=x[2],third=if(length(x)>2) x[3]))
}
lowerfunction<-function(mycall){
myfun<-function(first,second=0,third=NULL){
print(first)
print(second)
print(third)
}
mc<-match.call(definition = myfun, call = match.call()[[2]])
eval(mc)
}
Run Code Online (Sandbox Code Playgroud)
lowerfunction我在里面捕获函数调用match.call,并尝试评估调用.但由于变量x仅在环境中定义topfunction,评估失败:
topfunction(x=1:3)
Error in print(first) : object 'x' not found
Run Code Online (Sandbox Code Playgroud)
我知道我可以换线
lowerfunction(myfun(first=x[1],second=x[2],third=if(length(x)>2) x[3]))
Run Code Online (Sandbox Code Playgroud)
如
lowerfunction(substitute(myfun(first=x[1],second=x[2],third=if(length(x)>2) x[3])))
Run Code Online (Sandbox Code Playgroud)
in topfunction,但在我的实际应用程序中topfunction由用户构建,因此解决方案应该以某种方式发生在lowerfunction甚至是myfun级别中.但由于他们已经丢失了相关信息x,我不知道是否可以实现这一目标?
在实际应用程序中,topfunction构造模型使用lowerfunction并计算其可能性,而参数lowerfunction是一个可以包含函数调用的公式,将通过它来计算eval.这些功能仅在内部定义lowerfunction.另外,lowerfunction也可以直接调用,即
x<-1:3
lowerfunction(myfun(first=x[1],second=x[2],third=if(length(x)>2) x[3]))
# or …Run Code Online (Sandbox Code Playgroud) 假设我有一个具有成员的类模板,该成员pData是一个AxB任意类型的数组T.
template <class T> class X{
public:
int A;
int B;
T** pData;
X(int a,int b);
~X();
void print(); //function which prints pData to screen
};
template<class T>X<T>::X(int a, int b){ //constructor
A = a;
B = b;
pData = new T*[A];
for(int i=0;i<A;i++)
pData[i]= new T[B];
//Fill pData with something of type T
}
int main(){
//...
std::cout<<"Give the primitive type of the array"<<std::endl;
std::cin>>type;
if(type=="int"){
X<int> XArray(a,b);
} else if(type=="char"){
X<char> Xarray(a,b); …Run Code Online (Sandbox Code Playgroud) 假设我们正在使用一种按列优先顺序存储数组的语言。还假设我们有一个使用二维数组作为参数并返回它的函数。我想知道您是否可以声称在调用函数时转置此数组通常是有益的(或不是),以便使用按列操作而不是按行操作,或者转置是否会否定逐列运算的好处?
作为一个例子,在 RI 中有一个名为 ts 类的对象,y其维度为n x p,即我有p长度为 的时间序列n。
我需要y在 Fortran 中进行一些计算,其中有两个具有以下结构的循环:
do i = 1, n
do j= 1, p
!just an example, some row-wise operations on `y`
x(i,j) = a*y(i,j)
D = ddot(m,y(i,1:p),1,b,1)
! ...
end do
end do
Run Code Online (Sandbox Code Playgroud)
由于 Fortran(和 R 一样)使用按列存储,因此最好使用p x n数组进行计算。所以而不是
out<-.Fortran("something",y=array(y,dim(y)),x=array(0,dim(y)))
ynew<-out$out$y
x<-out$out$x
Run Code Online (Sandbox Code Playgroud)
我可以用
out<-.Fortran("something2",y=t(array(y,dim(y))),x=array(0,dim(y)[2:1]))
ynew<-t(out$out$y)
x<-t(out$out$x)
Run Code Online (Sandbox Code Playgroud)
其中 Fortran 子例程something2类似于
do i = 1, n
do j= 1, p …Run Code Online (Sandbox Code Playgroud)