2010-10-08 2 views
6

Как создать «пустой объект» в R? [edit: Я не знаю, как правильно называть эту «вещь», поэтому я называю ее «пустым объектом», другие: «пустой символ», «символ нулевой длины», «недостающий объект» также может использоваться]Создайте «недостающие объекты» (aka: «пустые символы», «пустые объекты»)/необходимо для обработки форматов/

[edit2: Наконец, я склоняюсь к «отсутствующему символьному объекту» для названия «вещь». Также представляется, что J.Chambers использует эту терминологию в своей книге 2008 года, см. Комментарии для ответа @ mbq. Согласно Chambers, «отсутствующий символ» имеет строку с нулевой длиной, как ее содержимое. Таким образом, as.symbol ("") должен создать такой объект, который она не в текущей версии R (2.11.1)]

Самый простой способ я смог найти

x <- alist(a=)$a 

[ Разъяснение]

Обратите внимание, что «пустой объект» не является объектом NULL или вектором длины 0. «Пустой объект» x в моем примере выше может использоваться в манипуляциях с формальными функциями, что мне и нужно для ,

Вот пример:

> al <- alist(a = 323, b = , c = 434) 
> al 
$a 
[1] 323 
$b 
$c 
[1] 434 

> 
> al[["c"]] <- numeric() 
> al 
$a 
[1] 323 
$b 
$c         #not empty 
numeric(0) 

> 
> al[["c"]] <- list()    
> al 
$a 
[1] 323 
$b 
$c         #not empty 
list() 

> 
> 
> al[["c"]] <- NULL     #object removed 
> al 
$a 
[1] 323 
$b 


> 
> al[["c"]] <- alist(a =)$a 
> al 
$a 
[1] 323 
$b 
$c          #empty 

Итак, я просто искал способ создания пустых объектов для использования в функциональных в формалях манипуляций. Я уверен, что там должен быть путь в базе R.

Вот пример:

> foo <- function(a = 3232, b = 234){b+a} 
> formals(foo) 
$a 
[1] 3232 

$b 
[1] 234 

> formals(foo)$c <- alist(a =)$a 
> formals(foo) 
$a 
[1] 3232 

$b 
[1] 234 

$c 


> foo <- function(a = 3232, b = 234){b+a} 
> formals(foo) 
$a 
[1] 3232 

$b 
[1] 234 

> formals(foo)$c <- alist(a =)$a 
> formals(foo) 
$a 
[1] 3232 

$b 
[1] 234 

$c 

Спасибо.

ответ

9

Попробуйте substitute():

foo <- function(a = 3232, b = 234) {} 
formals(foo)$c <- substitute() 
foo 
# function (a = 3232, b = 234, c) 
+0

Да, это он !!! Он создает эту неуловимую «вещь». – VitoshKa

+2

'bquote' в настоящее время делает то же самое. Я лично не буду полагаться на это поведение, так как он недокументирован, и есть другие способы достижения такого же результата. –

+1

@ Джошуа Ульрих - Яп! Хорошая точка зрения. – VitoshKa

2

В зависимости от типа:

x <- list() 
# empty vectors 
y <- numeric(0) 
z <- logical(0) 
... 

Теперь вы должны думать, действительно ли вы хотите создать пустой объект.

Редактировать: Вы также можете использовать опцию NULL. Основное отличие состоит в том, что объект NULL не имеет типа. Смотрите также ?"NULL"

+1

'числовой (0)' равно 'numeric()', то же самое с 'logical()'. – mbq

+2

Мне нужен пустой объект, а не только объект длиной 0. Я уточню Q, чтобы быть более точным. – VitoshKa

+1

@VitoshKa - в R нет пустых объектов, для этой цели служит только объект «NULL», плюс-минус. См. Мой ответ. – mbq

0

Также d <- c()

+0

Кто бы ни проголосовал - это, по крайней мере, попытайтесь объяснить, почему вы голосуете. –

4

Что вы сделали с alist(a=)$a не пустой объект, он пустой символ/имя («» скомпилированных в качестве имени символа). Я уверен, что он не может быть воспроизведен каким-либо другим способом (as.symbol('') вызывает ошибку).

+0

x имеет значение, которое является объектом. Я бы не был так уверен, что символ - лучшее имя для этой «вещи» :) – VitoshKa

+0

ну, после немного большего мышления, это действительно неоценимое выражение, которое «пусто». Поэтому, вероятно, технически было бы правильно спросить о пустом символе. С другой стороны, имя в R также является объектом, поэтому это тоже не так. – VitoshKa

+0

См. 'Is.symbol (formals (plot) $ x)' и 'deparse (formals (plot) $ x)'. Это говорит о том, что 'as.symbol (" ")' является правильным способом для этого, но он не работает в текущей версии R. – hadley

0

Также d <- ""

(обивка обивка обивка)

+0

Это действительно комментарий, а не ответ на вопрос. Пожалуйста, используйте «добавить комментарий», чтобы оставить отзыв для автора. – oleksii

+0

Я не согласен, это просто очень короткий ответ. Пользователь попросил пустого объекта. В R «пустой» - субъективный термин. –

1

Там нет 'пустого объекта'. Есть NULL, NA (в разных вариантах), списки нулевой длины и так далее. Откуда берется ваше понятие «пустой объект» и каковы свойства «пустого объекта»?

То, что вы создали с креном монстр:

> x<-alist(a=)$a 
> x 
Error: argument "x" is missing, with no default 

[некоторый его вид невычисленной функцией выражения аргумент вещи.Не «пустой объект» в каком-либо смысле слова, которое я знаю]

+0

Да, действительно, это неоценимая пустая «вещь». – VitoshKa

3

Как говорили другие, вы не создаете пустой объект. x содержит значение, которое является неоценимым выражением.

?alist говорит:

«крен» обрабатывает свои аргументы, если они описаны аргументы функции. Значения не оцениваются, а помеченные аргументы без значения - , тогда как «список» просто игнорирует их. 'Alist' чаще всего используется в соединении с 'formals'.

Это самый простой способ, я могу определить, добавить аргумент без значения для функции:

> foo <- function(a = 3232, b = 234){b+a} 
> formals(foo) <- c(formals(foo),alist(c=)) 
> formals(foo) 
$a 
[1] 3232 

$b 
[1] 234 

$c 
+0

Неоценимые выражения также являются объектами :). А как насчет замены c в форматах? Ваше решение попытается создать два c внутри, если c уже присутствует. Самое смешное, что R это позволит! – VitoshKa

+0

Я полностью согласен, поэтому спрашивать, как создать «пустой» объект, не имеет смысла. –

+0

Мое решение не будет создавать два «c», это добавит еще одно выражение в список пар. Вы пытаетесь программировать на языке, который отличается от программирования на языке. Вы должны прочитать [этот раздел] (http://cran.r-project.org/doc/manuals/R-lang.html#Computing-on-the-language) определения * R языка *. R позволяет это, потому что это допустимое выражение. –

Смежные вопросы