标签: r-extension

在R中为用户提供的随机数生成器播种

我在用R在R中播种用户定义的RNG时遇到了一些麻烦

set.seed(123, kind='user', normal.kind='user')
Run Code Online (Sandbox Code Playgroud)

实际上没有传递123给用户定义的RNG初始化.

我回到了现有的文档,?Random.user并尝试了那里给出的示例代码,稍加修改,我打印传递给user_unif_init函数的种子(下面的完整代码).

重现步骤:

  1. 粘贴下面的代码 urand.c
  2. R CMD SHLIB urand.c
  3. 打开 R
  4. 运行以下命令:

    > 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)

random r r-extension

6
推荐指数
1
解决办法
168
查看次数

如何在编写R扩展时返回命名的VECSXP

最近我遇到了一个错误,当我修复它时,我想知道是否有可能返回一个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)

或者这不可能吗?

c r s-expression r-extension

5
推荐指数
2
解决办法
501
查看次数

标签 统计

r ×2

r-extension ×2

c ×1

random ×1

s-expression ×1