Создать «отсутствующие объекты» (иначе: «пустые символы», «пустые объекты») / необходимые для манипулирования формалами / - PullRequest
6 голосов
/ 08 октября 2010

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

[edit2: в конце концов я склоняюсь к «отсутствующему объекту символа» для имени «вещи».Также кажется, что J.Chambers использует эту терминологию в своей книге 2008 года, см. Комментарии к ответу @ mbq.По словам Чамберса, «отсутствующий символ» содержит строку нулевой длины в качестве содержимого.Таким образом, 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  

Спасибо.

Ответы [ 7 ]

11 голосов
/ 08 октября 2010

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

foo <- function(a = 3232, b = 234) {}
formals(foo)$c <- substitute()
foo
# function (a = 3232, b = 234, c)
4 голосов
/ 08 октября 2010

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

3 голосов
/ 08 октября 2010

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

?alist говорит:

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

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

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

$b
[1] 234

$c
2 голосов
/ 08 октября 2010

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

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

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

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

1 голос
/ 08 октября 2010

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

То, что вы создали с помощью alist, является монстром:

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

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

0 голосов
/ 08 октября 2010

Также d <- ""

(padding padding)

0 голосов
/ 08 октября 2010

Также d <- c()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...