2010-10-08 11 views
6

¿Cómo crear un "objeto vacío" en R? [Editar: No sé cómo llamar correctamente a esta "cosa", así que lo llamo "objeto vacío", otros: "símbolo vacío", "símbolo de longitud cero", "objeto que falta" también podría ser utilizado]Crear "objetos faltantes" (también conocidos como "símbolos vacíos", "objetos vacíos")/necesarios para la manipulación de formales/

[edit2: finalmente tiendo a establecerme en el "objeto símbolo faltante" para el nombre de la "cosa". También parece que J.Chambers está utilizando esta terminología en su libro de 2008, ver comentarios para la respuesta de @ mbq. Según Chambers, el "símbolo que falta" tiene una cadena de longitud cero en su contenido. Por lo tanto, as.symbol ("") debe crear un objeto de este tipo, que no lo hace en la versión actual de R (2.11.1)]

La forma más sencilla que pude encontrar es

x <- alist(a=)$a 

[ Aclaración]

Tenga en cuenta que "objeto vacío" no es un objeto NULL o un vector de longitud 0. "Objeto vacío" x en mi ejemplo anterior podría utilizarse en la manipulación de formales de la función, que es lo que necesito para .

Aquí se muestra un ejemplo:

> 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 

Por lo tanto, estoy buscando una manera de crear objetos vacíos para su uso en formals manipulaciones de la función. Estoy bastante seguro de que debe haber una manera en R. base de

He aquí un ejemplo:

> 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 

Gracias.

Respuesta

9

Trate substitute():

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

Sí, eso es todo! Crea esta esquiva "cosa". – VitoshKa

+2

'bquote' actualmente hace lo mismo. Personalmente, no confiaría en este comportamiento, ya que no está documentado y hay otras formas de lograr el mismo resultado. –

+1

@Joshua Ulrich - ¡Yap! Buen punto. – VitoshKa

2

Dependiendo del tipo:

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

Ahora usted tiene que pensar si realmente desea crear un objeto vacío.

editar: También puede usar la opción NULL. La principal diferencia es que el objeto NULL no tiene un tipo. Ver también ?"NULL"

+1

'numérico (0)' es igual a 'numeric()', lo mismo con 'logical()'. – mbq

+2

Necesito un objeto vacío, no solo un objeto de longitud 0. Editaré la Q para ser más preciso. – VitoshKa

+1

@VitoshKa - no hay objetos vacíos en R, solo el objeto 'NULL' a más-menos sirve para este propósito. Ver mi respuesta – mbq

0

también d <- c()

+0

Quien haya votado, esto, al menos trate de explicar por qué está bajando la votación. –

4

¿Qué has hecho con alist(a=)$a no es un objeto vacío, que está vacío símbolo/nombre ('' compilada como nombre del símbolo). Estoy bastante seguro de que no se puede replicar de ninguna otra manera (as.symbol('') provoca un error).

+0

x tiene un valor, que es un objeto. No estaría tan seguro de que un símbolo sea un mejor nombre para esa "cosa" :) – VitoshKa

+0

bueno, después de pensar un poco más, de hecho es una expresión no evaluada, que es "vacía". Así que probablemente técnicamente sería correcto pedir un tipo de símbolo vacío. Por otro lado, un nombre en R también es un objeto, por lo que tampoco está mal. – VitoshKa

+0

Ver 'is.symbol (formales (parcela) $ x)' y 'deparse (formales (parcela) $ x)'. Esto sugiere que 'as.symbol (" ")' es la forma correcta de hacerlo, pero no funciona en la versión actual de R. – hadley

0

también d <- ""

(relleno acolchado relleno)

+0

Esto es realmente un comentario, no una respuesta a la pregunta. Utilice "agregar comentario" para dejar comentarios al autor. – oleksii

+0

No estoy de acuerdo, simplemente resulta ser una respuesta muy corta. El usuario pidió un objeto vacío. En R, "vacío" es un término subjetivo. –

1

No hay un 'objeto vacío'. Hay NULL, NA (en varios sabores), listas de longitud cero y así sucesivamente. ¿De dónde viene su concepto de "objeto vacío" y cuáles son las propiedades de un "objeto vacío"?

lo que han creado con a-lista es un monstruo:

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

[su algún tipo de función no evaluada cosa expresión argumento.No es un 'objeto vacío' en ningún sentido de la palabra que conozco]

+0

Sí, de hecho es una "cosa" vacía no evaluada. – VitoshKa

3

Como han dicho otros, no estás creando un objeto vacío. x tiene un valor, que es una expresión no evaluada.

?alist dice:

‘alista’ maneja sus argumentos como si se describen los argumentos de funciones. Por lo tanto, los valores no se evalúan, y los argumentos etiquetados sin valor son permitidos mientras que 'list' simplemente los ignora. 'Alist' se usa con mayor frecuencia en junto con 'formals'.

Esta es la forma más sencilla que puedo determinar añadir un argumento sin valor a una función:

> 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

Expresiones anómalas también son objetos :). ¿Y qué hay del reemplazo de c en formales? Su solución intentará crear dos c en el interior si c ya está presente. ¡Lo curioso es que R lo permitirá! – VitoshKa

+0

Estoy totalmente de acuerdo, por lo que no tiene sentido preguntar cómo crear un objeto "vacío". –

+0

Mi solución no creará dos "c", agrega otra expresión a la pairlist. Está intentando programar en el idioma, que es muy diferente a la programación con el idioma. Debe leer [esta sección] (http://cran.r-project.org/doc/manuals/R-lang.html#Computing-on-the-language) de * R Language Definition *. R lo permite porque es una expresión válida. –

Cuestiones relacionadas