Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R replicate()函数在Rcpp函数上不起作用_R_Rcpp_Replicate - Fatal编程技术网

R replicate()函数在Rcpp函数上不起作用

R replicate()函数在Rcpp函数上不起作用,r,rcpp,replicate,R,Rcpp,Replicate,我在使用R中的replicate()函数生成带有Rcpp函数的随机数时遇到问题。在R:中考虑以下函数 trial <- function(){rnorm(1)} replicate(10, trial()) 但是,我有一个C++函数 GeTrand()/,它生成高斯分布的随机数。我再次使用replicate调用函数,如下所示: [1] 0.7609912 -0.2949613 1.8684363 -0.3358377 -1.6043926 0.2706250 0.5528813

我在使用R中的
replicate()
函数生成带有Rcpp函数的随机数时遇到问题。在R:

中考虑以下函数
trial <- function(){rnorm(1)}
replicate(10, trial())

但是,我有一个C++函数<代码> GeTrand()/<代码>,它生成高斯分布的随机数。我再次使用replicate调用函数,如下所示:

 [1]  0.7609912 -0.2949613  1.8684363 -0.3358377 -1.6043926  0.2706250  0.5528813  1.0228125 -0.2419092 -1.4761937 
replicate(10,getRan())
> replicate(10,getRan())
 [1] -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932
> replicate(10,getRan())
 [1] -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785
> replicate(10,getRan())
 [1] -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953
> replicate(10,getRan())
 [1] -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935
#include <Rcpp.h>
// [[Rcpp::plugins(cpp11)]]
#include <random>

namespace {
  std::default_random_engine generator(std::random_device{}());
  std::normal_distribution<double> distribution (0.0,1.0);  
}

// [[Rcpp::export]]
double getRan(){
  return distribution(generator);
}

/*** R
replicate(10,getRan())
*/
它创建了一个相同数量的向量,如下所示:

 [1]  0.7609912 -0.2949613  1.8684363 -0.3358377 -1.6043926  0.2706250  0.5528813  1.0228125 -0.2419092 -1.4761937 
replicate(10,getRan())
> replicate(10,getRan())
 [1] -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932
> replicate(10,getRan())
 [1] -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785
> replicate(10,getRan())
 [1] -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953
> replicate(10,getRan())
 [1] -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935
#include <Rcpp.h>
// [[Rcpp::plugins(cpp11)]]
#include <random>

namespace {
  std::default_random_engine generator(std::random_device{}());
  std::normal_distribution<double> distribution (0.0,1.0);  
}

// [[Rcpp::export]]
double getRan(){
  return distribution(generator);
}

/*** R
replicate(10,getRan())
*/
但是,如果我多次调用该函数,它可以正常工作:

 getRan()
[1] 1.345227
> getRan()
[1] 0.3555393
> getRan()
[1] 1.587241
> getRan()
[1] 0.5313518
那么这里的问题是什么?
replicate()
函数是否重复从
getRan()
返回的相同函数,而不是多次调用
getRan()
?是虫子吗

PS:我知道我可以用<代码> RyMax(n)< /C>生成n个正态随机数,但是,我想用C++函数来生成更复杂的计算,基于生成随机数< /p> P> PPS:这是我的C++代码:

double getRan(){
  unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
  std::default_random_engine generator(seed);
  std::normal_distribution<double> distribution (0.0,1.0);
  double epi = distribution(generator);
  return epi;
}
double getRan(){
unsigned seed=std::chrono::system_clock::now();
std::默认随机引擎生成器(种子);
标准:正态分布(0.0,1.0);
双epi=配电(发电机);
返回计划免疫;
}

下面是一个反例,表明它工作正常:

代码
下面是一个反例,表明它工作正常:

代码
德克斯的回答是正确的。你应该使用R的RNG。如果你坚持在C++中使用RNG,你可以使用这样的东西:

 [1]  0.7609912 -0.2949613  1.8684363 -0.3358377 -1.6043926  0.2706250  0.5528813  1.0228125 -0.2419092 -1.4761937 
replicate(10,getRan())
> replicate(10,getRan())
 [1] -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932
> replicate(10,getRan())
 [1] -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785
> replicate(10,getRan())
 [1] -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953
> replicate(10,getRan())
 [1] -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935
#include <Rcpp.h>
// [[Rcpp::plugins(cpp11)]]
#include <random>

namespace {
  std::default_random_engine generator(std::random_device{}());
  std::normal_distribution<double> distribution (0.0,1.0);  
}

// [[Rcpp::export]]
double getRan(){
  return distribution(generator);
}

/*** R
replicate(10,getRan())
*/
#包括
//[[Rcpp::插件(cpp11)]]
#包括
名称空间{
std::default_random_引擎生成器(std::random_设备{}());
标准:正态分布(0.0,1.0);
}
//[[Rcpp::导出]]
双getRan(){
回流分配(发电机);
}
/***R
复制(10,getRan())
*/
这样可以避免在每次函数调用时创建
std::default\u random\u engine
(和
std::normal\u distribution
)的新实例。这一点很重要,因为只有从一个RNG重复提取才能保证RNG的属性。不适用于从不同的RNG中重复提取(希望不同)种子


顺便说一句,在我的系统上,您的原始代码多次不会产生相同的数字。如果您在使用
std::random_设备时遇到问题,并且正在windows上工作,您可能会受到影响。在这种情况下,按时间播种是更好的选择。

德克斯的答案是正确的。你应该使用R的RNG。如果你坚持在C++中使用RNG,你可以使用这样的东西:

 [1]  0.7609912 -0.2949613  1.8684363 -0.3358377 -1.6043926  0.2706250  0.5528813  1.0228125 -0.2419092 -1.4761937 
replicate(10,getRan())
> replicate(10,getRan())
 [1] -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932
> replicate(10,getRan())
 [1] -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785
> replicate(10,getRan())
 [1] -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953
> replicate(10,getRan())
 [1] -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935
#include <Rcpp.h>
// [[Rcpp::plugins(cpp11)]]
#include <random>

namespace {
  std::default_random_engine generator(std::random_device{}());
  std::normal_distribution<double> distribution (0.0,1.0);  
}

// [[Rcpp::export]]
double getRan(){
  return distribution(generator);
}

/*** R
replicate(10,getRan())
*/
#包括
//[[Rcpp::插件(cpp11)]]
#包括
名称空间{
std::default_random_引擎生成器(std::random_设备{}());
标准:正态分布(0.0,1.0);
}
//[[Rcpp::导出]]
双getRan(){
回流分配(发电机);
}
/***R
复制(10,getRan())
*/
这样可以避免在每次函数调用时创建
std::default\u random\u engine
(和
std::normal\u distribution
)的新实例。这一点很重要,因为只有从一个RNG重复提取才能保证RNG的属性。不适用于从不同的RNG中重复提取(希望不同)种子


顺便说一句,在我的系统上,您的原始代码多次不会产生相同的数字。如果您在使用
std::random_设备时遇到问题,并且正在windows上工作,您可能会受到影响。在这种情况下,按时间播种是更好的选择。

有趣。你能检查一下如果你做lappy(1:10,getRan)
会发生什么吗?我怀疑这与
replicate
获取表达式有关,但除此之外,我不确定…发布一个可复制的示例。这只是一个(可能是善意的,但仍然无用的)咆哮……我的水晶球告诉我,在C++中,RNG用相同的种子实例化。对于更多,我们需要一个.@ das2它产生:> LoPixy(1:10,GeTRAN)错误在乐趣(x[[i]),…:未使用的参数(x[[i])@ RalfStubner,谢谢,我也同样实现了,我用时间作为种子,所以当函数被调用为复制()时,种子是相同的,我知道如何解决它,这是我的C++代码:<代码>双GeTrand(){unsigned seed=std::chrono::system_clock::now().time_since_epoch().count();std::default_random_引擎生成器(seed);std::normal_分布(0.0,1.0);double epi=distribution(generator);return epi;}
有趣。您能检查一下如果执行
lappy(1:10,getRan)会发生什么吗
?我怀疑这与
replicate
获取表达式有关,但除此之外,我不确定……发布一个可复制的示例。到目前为止,这只是一个(可能是出于好意,但仍然没有用)RANT……我的水晶球告诉我,在C++中,RNG用同一个种子实例化。对于更多,我们需要一个.@ DASH2,它产生:> LoPix:1:10,GeTRAN错误(x[[i]),…:未使用的参数(x[[i])@ RalfStubner,谢谢,我也同样意识到了同样的事情,我用时间作为种子,所以当函数用复制程序()调用时种子是相同的,我知道如何解决它,这里是我的C++代码:<代码>双GeTrand():unSealStay= STD:::Time::StulyLogCiel:No()。Tim::Debug TraceRead OngEngor生成器(种子);STD::Noimig分布分布(0.01.0);双EPI=分发(生成器);返回EPI;}如果不包含名称,则名称空间声明的目的是什么?@thc这是一个匿名名称空间。有关更多信息,请参阅此处的示例。如果不包含名称,则名称空间声明的目的是什么?@thc这是一个匿名名称空间。有关更多信息,请参阅此处的示例