«unlockEnvironment» реализован через «Rcpp» вместо «встроенный»
Может ли кто-то заставить меня начать то, что мне нужно сделать, чтобы реализовать кодunlockEnvironment
ниже вRcpp?
Наткнулся на этосообщение и попробовал решение Winston Chang, основанное на C-коде,в соответствии, Это работает, но у меня такое чувство, что я слишком мало знаю (практически ничего) о встроенном или C / C ++, чтобы действительно знать, что я делаю ;-)
Поэтому я подумал, что это будет отличная возможность, наконец, начать изучать, как использовать R в качестве интерфейса к C и C ++. И я думаю, что я хотел бы прыгать наRcpp тренируйся для этого!
Код от УинстонаСутьrequire("inline")
inc <- '
/* This is taken from envir.c in the R 2.15.1 source
https://github.com/SurajGupta/r-source/blob/master/src/main/envir.c
*/
#define FRAME_LOCK_MASK (1<<14)
#define FRAME_IS_LOCKED(e) (ENVFLAGS(e) & FRAME_LOCK_MASK)
#define UNLOCK_FRAME(e) SET_ENVFLAGS(e, ENVFLAGS(e) & (~ FRAME_LOCK_MASK))
'
src <- '
if (TYPEOF(env) == NILSXP)
error("use of NULL environment is defunct");
if (TYPEOF(env) != ENVSXP)
error("not an environment");
UNLOCK_FRAME(env);
// Return TRUE if unlocked; FALSE otherwise
SEXP result = PROTECT( Rf_allocVector(LGLSXP, 1) );
LOGICAL(result)[0] = FRAME_IS_LOCKED(env) == 0;
UNPROTECT(1);
return result;
'
unlockEnvironment <- inline::cfunction(
signature(env = "environment"),
includes = inc,
body = src
)
Ошибка рефакторингаС другой стороны: я столкнулся с ошибкой в коде Уинстона, когда определенным образом организовал его в/R
каталог моего пакета проекта:
Используя методы S4, я пытался выделить код Уинстона в стандартную функцию R.unlockEnvironment()
что я положил в файл/R/.unlockEnvironment.r
Затем я бы создал свои методы S4 дляunlockEnvironment()
в/R/unlockEnvironment.r
, Метод с подписьюenv:environment
тогда просто позвонил бы.unlockEnvironment(env = env)
.
Настраивая вещи таким образом, я получаю следующую ошибку:
Ошибка в .Primitive (". Call") (, env): значение NULL передается как адрес символа
Если я введу код в/R/.unlockEnvironment.r
каталог с соответствующим методом в/R/unlockEnvironment.r
(Таким образом, повторное использование встроенного кода каждый раз, когда соответствующий методunlockEnvironment()
называется), все работает просто отлично - но это очень неэффективно из-за многократного использования ресурсов.
Так что, я думаю, это должно быть связано либо с тем, как написан код C, либо с тем, как вам нужно организовать свои функции на основе C при использованиив соответствии?