我在用R在R中播种用户定义的RNG时遇到了一些麻烦
set.seed(123, kind='user', normal.kind='user')
Run Code Online (Sandbox Code Playgroud)
实际上没有传递123给用户定义的RNG初始化.
我回到了现有的文档,?Random.user并尝试了那里给出的示例代码,稍加修改,我打印传递给user_unif_init函数的种子(下面的完整代码).
重现步骤:
urand.cR CMD SHLIB urand.cR运行以下命令:
> dyn.load('urand.so')
> set.seed(123, kind='user', normal.kind='user')
Received seed: 720453763
Received seed: 303482705 // any other numbers than 123
Run Code Online (Sandbox Code Playgroud)这是我用过的完整代码urand.c:
// ## Marsaglia's congruential PRNG
#include <stdio.h>
#include <R_ext/Random.h>
static Int32 seed;
static double res;
static int nseed = 1;
double * user_unif_rand()
{
seed = 69069 * seed + 1;
res = seed * 2.32830643653869e-10; …Run Code Online (Sandbox Code Playgroud) 最近我遇到了一个错误,当我修复它时,我想知道是否有可能返回一个VECSXP(即一个R列表类型),其中元素被命名.这个c ++代码:
SEXP do_bla()
{
int prtCnt = 0;
SEXP a = PROTECT(allocMatrix(REALSXP, 5, 5));
prtCnt++;
SEXP b = PROTECT(allocVector(REALSXP, 5));
prtCnt++;
SEXP OS = PROTECT(allocVector(VECSXP, 2));
prtCnt++;
SET_VECTOR_ELT(OS, 0, a);
SET_VECTOR_ELT(OS, 1, b);
UNPROTECT(prtCnt);
return OS;
}
Run Code Online (Sandbox Code Playgroud)
会给我一个R中两个元素(矩阵和向量)的列表:
s <- .Call("do_bla", ....)
Run Code Online (Sandbox Code Playgroud)
可以像这样索引:
s[[1]]; s[[2]]
Run Code Online (Sandbox Code Playgroud)
为了实现这一目标,我需要做些什么改变:
s$a; s$b
Run Code Online (Sandbox Code Playgroud)
或者这不可能吗?