Я хотел бы передать переменное количество аргументов из функции в C/C++, но хотел бы оставить аргументы невычисленными и в то же время не хочу выполнять какие-либо вычисления в R (кроме вызова C/C++ функция), то есть я не хочу вызывать substitute
в моей функции R. Один из вариантов, который, как я думал, я мог бы использовать, - это .External
и сделать что-то вроде этого:
R_fn = function(...) .External("cpp_fn", ...)
...
# and in C code:
SEXP cpp_fn (SEXP arglist) {
}
Однако .External
оценивает аргументы в ...
, поэтому, если я попробую что-то вроде
rm(x, y) # just making sure these don't exist
R_fn(x*y)
Я получаю сообщение об ошибке, потому что R пытается оценить x*y
прежде чем отправить его в функцию.
Для сравнения, в R работает следующее:
f = function(...) g(...)
g = function(x, ...) print(substitute(x))
f(x*y*z)
# x * y * z
Какие еще варианты у меня есть? Очевидно, что это можно сделать так, как это делает сам R для ряда функций, например. substitute
сам, но я не понимаю, как это сделать. Я добавил тег rcpp
, потому что в конечном итоге я буду использовать его в Rcpp
.
substitute
, учитывая, для чего он предназначен? Но тогда мои познания в R-внутренностях довольно начальные. Есть ли рабочая причина, по которой вы не можете использоватьsubstitute
? Это удобно решает проблему, как в следующем примере:require( inline ); cdr <- cfunction(c(x = "ANY"), 'return(CDR(x));'); cdr( substitute( x * y ) );cdr( x * y )
- person Simon O'Hanlon   schedule 30.10.2013substitute
, потому что я хочу абсолютно минимизировать время, затрачиваемое на различные отправки R, и эти вызовы в конечном итоге обходятся мне дорого. - person eddi   schedule 30.10.2013$
, чьи аргументы никогда не оцениваются, а также[[
(оба вsrc/main/subset.c
). В нем конкретно указано:/* The [[ subset operator. It needs to be fast. */
. Может быть, там есть какие-то указатели. - person Simon O'Hanlon   schedule 30.10.2013cdr
выше из Расширенный R - person Simon O'Hanlon   schedule 30.10.2013.Call()
. - person Dirk Eddelbuettel   schedule 30.10.2013.Primitive
для взаимодействия с C, и я не думаю, что это доступно для меня (не так ли?) - person eddi   schedule 30.10.2013substitute
сначала, но я бы очень хотел избежать лишних вычислений в R - person eddi   schedule 30.10.2013substitute
,||
,&&
и т. д. все передают свои аргументы в C без оценки - что в них такого особенного? (может быть, это еще один способ сказать, что я не понимаю, как работает.Primitive
); может показаться, что это не так уж и много работы, но когда ваша функция C++ вызывает вашу собственную функцию R в цикле, это довольно много. - person eddi   schedule 30.10.2013substitute
? Или универсального ответа на этот вопрос нет? - person eddi   schedule 31.10.2013rcpp
. - person Dirk Eddelbuettel   schedule 31.10.2013