There is currently no way to write your own unary operator in R. The only current unary operators are prefix (-, +, !). It would take some major changes to the parser to recognize the syntax that you want (which could also break other things that already work well), and with the oo and other methods it is not really needed. You can technically pass and empty expression to a binary operator:
> `%++%` <- function(a,b) a + 1 > x <- 5 > x %++% {} [1] 6 but that does not change the value of the variable (and using `assign` just creates its own problems). And syntax like above is more appropriate for a obfuscated R contest than for anything that you want to be understood. There are assignment functions and you could create an object type and an assignment for such that you might be able to have syntax like: a <- {} to increment a, but you would need to declare a class for a before using it and it would probably be even more complicated than needed. If you really want C like syntax then you could always make an active binding: > f <- local({ + e <- environment() + x <- 1 + list(inc = function(v) { + if(missing(v)) { + e$x <- e$x + 1 + } else { + stop('unary inc cannot be assigned to') + } + x + }, + dec = function(v) { + e$x <- e$x - 1 + x + } ) } ) > > makeActiveBinding("x++", f$inc, .GlobalEnv) > makeActiveBinding("x--", f$dec, .GlobalEnv) > > `x++` [1] 2 > `x++` [1] 3 > `x++` [1] 4 > `x--` [1] 3 > `x--` [1] 2 > `x++` [1] 3 > But it seems simpler to just go with the reference class system at this point. On Sun, Oct 19, 2014 at 11:17 AM, PO SU <rhelpmaill...@163.com> wrote: > > It's a good way to use RF OOS, but it's not my needing, actually, i want is > there exists a way to write a %++% form function that can pass one param to > it? > So i can use 1%++% to get 2 ,a<-2 , a%++% to get a<-3 . > It seems that the operator overwrite system in R, must pass two params. Is it > true? > > > > > -- > > PO SU > mail: desolato...@163.com > Majored in Statistics from SJTU > > > > At 2014-10-18 00:54:40, "Greg Snow" <538...@gmail.com> wrote: >>You may be interested in looking at Reference Classes/objects (see >>?setRefClass). This is a form of OO programming that is more similar >>to C++ and Java. You could create a counter object that you could >>then increment with syntax like: >> >>x$inc() >>x$inc(5) >> >>The first would increment by the default (1), the second would then >>increment by 5. >> >> >> >>On Fri, Oct 17, 2014 at 2:06 AM, PO SU <rhelpmaill...@163.com> wrote: >>> >>> Tks for your alternative way's details. but like you mentioned in graphics >>> package, i still wonder how to overload an operator which can pass one >>> param like +2 . >>> There seems exists some examples for my needing. But i try to find them but >>> without any results. >>> can you show me some examples from it? >>> >>> >>> >>> >>> >>> >>> -- >>> >>> PO SU >>> mail: desolato...@163.com >>> Majored in Statistics from SJTU >>> >>> >>> >>> At 2014-10-17 15:16:47, "David Winsemius" <dwinsem...@comcast.net> wrote: >>>> >>>>On Oct 16, 2014, at 10:36 PM, PO SU wrote: >>>> >>>>> >>>>> Tks for your advice, let the ++ problem alone, how to write an >>>>> Unary operator ? Is it permitted in R? >>>>> such as a<-2 , a%+2% will let a be 4 . >>>> >>>>OK, that's just wrong. Oh, OK, just for fun, as it were: >>>> >>>>inc <- function(x) >>>>{ >>>> eval.parent(substitute(x <- x + 1)) >>>>} >>>> >>>> >>>> > inc(10) >>>>Error in 10 <- 10 + 1 : invalid (do_set) left-hand side to assignment >>>> > y=10 >>>> > inc(y) >>>> > y >>>>[1] 11 >>>> >>>> >>>>> I just want to know it , i won't pollute r with it , because i know >>>>> what is r . : ) >>>>> >>>>It's certainly permitted. Just look at all the overloadings of the "+" >>>>operator in graphics packages. Look up the documentation on methods in >>>>R. >>>> >>>>Why not just use a well-behaved function, though? >>>> >>>>.inc <- function(x) x+1 >>>> > .inc(10) >>>>[1] 11 >>>> >>>>Then you won't be tempted to try 10 <- .inc(10) because it just >>>>wouldn't make sense. >>>> >>>>-- >>>>David. >>>> >>>>> -- >>>>> >>>>> PO SU >>>>> mail: desolato...@163.com >>>>> Majored in Statistics from SJTU >>>>> >>>>> >>>>> >>>>> >>>>> At 2014-10-17 13:09:47, "Rolf Turner" <r.tur...@auckland.ac.nz> wrote: >>>>>> On 17/10/14 17:29, PO SU wrote: >>>>>>> >>>>>>> Dear expeRts, >>>>>>> Now i want to know how to implement an Unary operator like i++ >>>>>>> in cpp's synax form. >>>>>>> e.g. 2++ will let 2 be 3 , a<-2 ,a++ ,will let a be 3 >>>>>>> I tried this : >>>>>>> '%++%'<-function(x){ >>>>>>> x<<-x+1 >>>>>>> } >>>>>>> but it have problem, the biggest one is it seems the function need >>>>>>> twoparams like a%++%b , how to write a function needing just one >>>>>>> param? >>>>>>> >>>>>>> TKS ! >>>>>> >>>>>> Just ***DON'T***. The "++" operator is useful only for those wish to >>>>>> write code which is obscure to the point of incomprehensibility. It >>>>>> makes C and its offspring "write only" languages. >>>>>> >>>>>> If you are going to use R, use R and don't pollute it with such >>>>>> abominations. >>>>>> >>>>>> cheers, >>>>>> >>>>>> Rolf Turner >>>>>> >>>>>> >>>>>> -- >>>>>> Rolf Turner >>>>>> Technical Editor ANZJS >>>>> ______________________________________________ >>>>> R-help@r-project.org mailing list >>>>> https://stat.ethz.ch/mailman/listinfo/r-help >>>>> PLEASE do read the posting guide >>>>> http://www.R-project.org/posting-guide.html >>>>> and provide commented, minimal, self-contained, reproducible code. >>>> >>>>David Winsemius, MD >>>>Alameda, CA, USA >>>> >>> ______________________________________________ >>> R-help@r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-help >>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html >>> and provide commented, minimal, self-contained, reproducible code. >> >> >> >>-- >>Gregory (Greg) L. Snow Ph.D. >>538...@gmail.com -- Gregory (Greg) L. Snow Ph.D. 538...@gmail.com ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.