It works, thanks a lot!<br><div class="gmail_quote"><div dir="ltr">Qiang Kou <<a href="mailto:qkou@umail.iu.edu">qkou@umail.iu.edu</a>>于2016年11月11日 周五09:07写道:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">Hi, Jingyu,<div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I post a small example below. I think this is what you want.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Best,</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">KK</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg">#include <Rcpp.h></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">using namespace Rcpp;</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">//[[Rcpp::export]]</div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg">void test(Nullable<Function> f = R_NilValue) {</div><div class="gmail_msg">  if (f.isNotNull()) {</div><div class="gmail_msg">    Rcpp::Rcout << "Not NULL fun" << std::endl;</div><div class="gmail_msg">    Function f2(f);</div><div class="gmail_msg">    f2();</div><div class="gmail_msg">  } else {</div><div class="gmail_msg">    Rcout << "NULL fun" << std::endl;</div><div class="gmail_msg">  }</div><div class="gmail_msg">}</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">/* R code</div><div class="gmail_msg">> Rcpp::sourceCpp("test.cpp")</div><div class="gmail_msg">> f_test <- function() {</div><div class="gmail_msg">+ print("test fun")</div><div class="gmail_msg">+ }</div><div class="gmail_msg">> test(f_test)</div><div class="gmail_msg">Not NULL fun</div><div class="gmail_msg">[1] "test fun"</div><div class="gmail_msg">> test()</div><div class="gmail_msg">NULL fun</div><div class="gmail_msg">*/</div></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><br class="gmail_msg"></div></div><div class="gmail_extra gmail_msg"><br class="gmail_msg"><div class="gmail_quote gmail_msg"></div></div><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg">On Fri, Nov 11, 2016 at 7:18 AM, Dirk Eddelbuettel <span dir="ltr" class="gmail_msg"><<a href="mailto:edd@debian.org" class="gmail_msg" target="_blank">edd@debian.org</a>></span> wrote:<br class="gmail_msg"></div></div><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="gmail_msg"><br class="gmail_msg">
On 11 November 2016 at 05:53, Jingyu He wrote:<br class="gmail_msg">
| I've deleted the post on StackOverflow. Sorry for the ambiguity, the problem is<br class="gmail_msg">
| not arg, but the Function f. <br class="gmail_msg">
|<br class="gmail_msg">
|<br class="gmail_msg">
| #include <Rcpp.h><br class="gmail_msg">
| using namespace Rcpp;<br class="gmail_msg">
| // [[Rcpp::export]]<br class="gmail_msg">
| RObject cppfunction(Function rfunction = NULL) {<br class="gmail_msg">
|       if( rfunction == NULL){<br class="gmail_msg">
|       cout << 1 + 1 << endl;  // if we don't pass rfunction to cppfunction, run<br class="gmail_msg">
| something not related to rfunction() <br class="gmail_msg">
|       }else{<br class="gmail_msg">
|      rfunction()  // if we pass rfunction to cppfunction, run it<br class="gmail_msg">
|       }<br class="gmail_msg">
| }<br class="gmail_msg">
|<br class="gmail_msg">
| rfunction is an argument of cppfunction. Sometimes I need to pass rfunction to<br class="gmail_msg">
| cppfunction sometimes not. So I need to set a default rfunction (something like<br class="gmail_msg">
| NULL indicating not passing it). <br class="gmail_msg">
|<br class="gmail_msg">
| But <br class="gmail_msg">
|    RObject cppfunction(Function rfunction = NULL) <br class="gmail_msg">
| doesn't work. How can I make it?<br class="gmail_msg">
<br class="gmail_msg">
</span>Well that is a different question :) But it has a nice answer: use<br class="gmail_msg">
<br class="gmail_msg">
   Rcpp::Nullable<Rcpp::Function> rfunction<br class="gmail_msg">
<br class="gmail_msg">
and test via<br class="gmail_msg">
<br class="gmail_msg">
   if (rfunction.isNull())<br class="gmail_msg">
<br class="gmail_msg">
(Untested, but should work)<br class="gmail_msg">
<span class="m_8082743965985294943im m_8082743965985294943HOEnZb gmail_msg"><br class="gmail_msg">
Dirk<br class="gmail_msg">
<br class="gmail_msg">
--<br class="gmail_msg">
<a href="http://dirk.eddelbuettel.com" rel="noreferrer" class="gmail_msg" target="_blank">http://dirk.eddelbuettel.com</a> | @eddelbuettel | <a href="mailto:edd@debian.org" class="gmail_msg" target="_blank">edd@debian.org</a><br class="gmail_msg">
</span></blockquote></div></div><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="m_8082743965985294943HOEnZb gmail_msg"><div class="m_8082743965985294943h5 gmail_msg">_______________________________________________<br class="gmail_msg">
Rcpp-devel mailing list<br class="gmail_msg">
<a href="mailto:Rcpp-devel@lists.r-forge.r-project.org" class="gmail_msg" target="_blank">Rcpp-devel@lists.r-forge.r-project.org</a><br class="gmail_msg">
<a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel</a><br class="gmail_msg">
</div></div></blockquote></div></div><div class="gmail_extra gmail_msg"><br class="gmail_msg"><br clear="all" class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div>-- <br class="gmail_msg"><div class="m_8082743965985294943gmail_signature gmail_msg" data-smartmail="gmail_signature"><div dir="ltr" class="gmail_msg">Qiang Kou<div class="gmail_msg"><a href="mailto:qkou@umail.iu.edu" class="gmail_msg" target="_blank">qkou@umail.iu.edu</a><br class="gmail_msg"><div class="gmail_msg">School of Informatics and Computing, Indiana University</div><div class="gmail_msg"><br class="gmail_msg"></div></div></div></div>
</div></blockquote></div>