Ответ 1
Это строго эквивалентно. Это функция, называемая PROTECT (от https://svn.r-project.org/R/trunk/src/main/memory.c)
SEXP protect(SEXP s)
{
if (R_PPStackTop >= R_PPStackSize)
R_signal_protect_error();
R_PPStack[R_PPStackTop++] = CHK(s);
return s;
}
static R_INLINE SEXP CHK(SEXP x)
{
/* **** NULL check because of R_CurrentExpr */
if (x != NULL && TYPEOF(x) == FREESXP)
error("unprotected object (%p) encountered (was %s)",
x, sexptype2char(OLDTYPE(x)));
return x;
}
#else
#define CHK(x) x
#endif
и from.include/Rinternals.h:
#define TYPEOF(x) ((x)->sxpinfo.type)
Как вы можете видеть, аргумент указателя возвращается без изменений, так что
var = PROTECT(p)
PROTECT(var = p)
эквивалентны