«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 при использованиив соответствии?

Ответы на вопрос(1)

Ваш ответ на вопрос