2012-08-05 18 views
6

Escribí una función de operador binario para R (es decir, uno con un nombre como %X% para que en lugar de tener que escribir %X%(a,b) pueda usar la sintaxis más conveniente a %X% b. Mi objetivo es tener un contenedor para <- que haga cosas como registrar qué se hizo a los objetos en ese entorno y buscar un atributo 'protegido' que advierta al usuario antes de sobrescribir ese objeto.En R, ¿cómo obtener toda la línea de comando en el sys.call() de un operador binario?

Todo esto funciona, excepto que si intento hacer algo como a %X% b + c dentro de la función todo lo que ve es a %X% b _y eso es todo lo que hace; a se le asigna el valor de byc se ignora por completo. a %X% (b + c) funciona igual que %X%(a, b + c), pero el objetivo de escribir esto como ab operador inary es evitar paréntesis.

Si sobrescribo <-, su sys.call() lo ve todo a la izquierda y a la derecha. ¿Por qué el mío solo ve solo los nombres adyacentes de la línea de comando?

Aquí es código que se replica este problema:

`%X%` <- function(...){ 
    print(deparse(sys.call())); 
} 

a %X% 3 + 1:10; 

El resultado deseado es "a%% X 3 + 1:10" El resultado observado es "a% X% 3"

Gracias.

+1

Impar; cuando ejecuto el código (R 2.15.1) obtengo 'Error en un% X% 3 + 1:10: argumento no numérico para el operador binario' –

+0

@DavidRobinson, el error proviene del operador' + 'al intentar sume la salida de 'a% X% 3' de tipo carácter con' 1: 10' de tipo numérico. – flodel

Respuesta

2

Supongo que no hay forma de reducir la precedencia de un operador personalizado. Sin embargo, creo que he encontrado una solución cursi: puedo nombrar mi operador<<-

Realmente no entiendo cómo <- fábrica expedidora, y tiene que haber docenas de diferentes métodos específicos del objeto de <- (ninguno de los cuales aparecer en methods( < -.. ) único que sé es que cuando puedo reemplazar <- todo tipo de roturas cosas

sin embargo, <<- tiene una precedencia cercana a la de <-, y no es particularmente útil porque para el caso ocasional donde realmente necesitas escribe una variable global desde dentro de una función o un ciclo, solo puedes usar .GlobalEnv[['foo']] <- bar o assign('foo',bar,env=.GlobalEnv).

Además, dado que solo estoy intentando registrar y proteger contra escritura objetos en .GlobalEnv en primer lugar, el nuevo significado que asigno a <<- es incluso algo consistente con el original.

6

Esto tiene que ver con la precedencia del operador, vea ?Syntax para obtener más ayuda. Dice que los operadores especiales (%any%) como el que está tratando de definir tienen mayor prioridad que el + binario, por lo que no hay otra forma (AFAIK) para usted que usar paréntesis y hacer a %X% (b + c).

+0

Por curiosidad: ¿cómo funciona '<-' /' = '? Supongo que no es un operador binario –

+0

@DavidRobinson, '<-' y' = 'son operadores binarios, con muy baja precedencia, vea'? Sintaxis'. – flodel

Cuestiones relacionadas