2015-04-10 4 views
4

Информация о недостающих аргументах в внутренних устройствах R: Missingness.
Мне интересно, есть ли способ установить (переписать) аргумент функции на R_MissingArg внутри этой функции?
Вид:Недостаточность аргумента силы R - R_MissingArg

f <- function(x){ 
    if(!missing(x)) message("x non missing") 
    make_missing(x) 
    if(missing(x)) message("x missing") 
    invisible() 
} 

Я понимаю, это не может быть рекомендуемым способом, и я, вероятно, следует использовать x <- NULL и is.null(x) вместо проверки missingness.

+1

Уточнить, почему вы хотите сделать это? Я предполагаю, что это происходит потому, что вы пытаетесь передать его другой функции, которая по умолчанию вам нужна, поэтому вы хотите, чтобы она отсутствовала (в противном случае, если вы просто используете ее в теле функции, вы просто выполните: isMissing = (x) и использовать этот флаг. Если вы хотите использовать по умолчанию для последующего вызова, вам, вероятно, потребуется вручную настроить вызов с помощью таких функций, как args() <-. – jimmyb

+0

Я не вижу контекста, который оправдывает использование 'make_missing (x)' вместо 'x <- NULL' в производственном коде. Но у меня есть некоторый код для работы, который довольно длинный и существует несколько проверок' missing (x) ', это будет удобно, чтобы не обновлять все эти проверки до 'is.null (x)' только для проверки некоторой новой вещи. – jangorecki

+2

Возможно, вы могли бы использовать 'x <- substitute()': 'f = function (x) {x = substitute (x)); missing (x)}; f (5) ' –

ответ

3

Вы могли бы заменить "х" с substitute():

var = substitute() 
var 
#Error: argument "var" is missing, with no default 

И, несмотря на то, что безопаснее всего использовать x = substitute(), ваш make_missing может выглядеть примерно так:

make_missing = function(x) assign(deparse(substitute(x)), 
            substitute(), 
            envir = parent.frame()) 

И ваш "е":

f = function(x) 
{ 
    if(missing(x)) message("missing") else message("not missing") 

    make_missing(x) 
    if(missing(x)) message("missing") else message("not missing") 
} 
f() 
#missing 
#missing 
f(7) 
#not missing 
#missing 
Смежные вопросы