[R] Issue with formula conversion

David Winsemius dwinsemius at comcast.net
Wed Aug 27 22:41:33 CEST 2014


On Aug 27, 2014, at 1:33 PM, Richard M. Heiberger wrote:

> do you have control over the external source?
> 
> if so, then something like
> 
> BlockFunction <- "pdComSymm"
> ranEff1 <- "~Variety -1"

I doubt that would work, since it is not a formula object.
> 
> fm <- lme(yield ~ nitro, data=Oats,
> random=list(Block=get(BlockFunction)(ranEff1)))

After correcting the misspelling of the function name, I tested this approach:

 BlockFunction <- "pdCompSymm"
 ranEff1 <- as.formula("~Variety -1")
 fm <- lme(yield ~ nitro, data=Oats, random=list(Block=do.call(BlockFunction, list(form=ranEff1) )
  ))
 fm
#----------
Linear mixed-effects model fit by REML
  Data: Oats 
  Log-restricted-likelihood: -296.5209
  Fixed: yield ~ nitro 
snipped

-- 
David.
> 
> The above is untested.  An example if get() is
>> get("sum")(1:4)
> [1] 10
> 
> The main problem with David's solution, which does work, is the use
> of the eval(parse()) idiom.  This is usually strongly discouraged.  See, for
> example,
> 
>> fortunes::fortune(106)
> 
> If the answer is parse() you should usually rethink the question.
>   -- Thomas Lumley
>      R-help (February 2005)
> 
> On Wed, Aug 27, 2014 at 4:11 PM, Gang Chen <gangchen6 at gmail.com> wrote:
>> Good point!
>> 
>> Here is an example:
>> 
>> library(nlme)
>> fm <- lme(yield ~ nitro, data=Oats, random=list(Block=pdComSymm(~Variety-1)))
>> 
>> Now the problem I'm facing is that the following part
>> 
>> pdComSymm(~Variety-1)
>> 
>> is read in as a string of characters from an external source:
>> 
>> ranEff <- 'pdComSymm(~Variety-1)'
>> 
>> The following
>> 
>> (ranEff1 <- as.formula(ranEff))
>> ~Variety - 1
>> 
>> is not what I want. Even though
>> 
>> fm <- lme(yield ~ nitro, data=Oats, random=list(Block=pdCompSymm(ranEff1)))
>> 
>> works, I don't know the 'pdCompSymm' part in advance and would like to
>> make the process automatic.
>> 
>> On Wed, Aug 27, 2014 at 3:49 PM, David Winsemius <dwinsemius at comcast.net> wrote:
>>> 
>>> On Aug 27, 2014, at 12:44 PM, Gang Chen wrote:
>>> 
>>>> Thanks for the help! However, I just need to get
>>>> 
>>>> pdCompSymm(~1 + Age)
>>> 
>>> That's not a formula in the R sense of the word. You should do a better job of posting a use case. Perhaps you want an expression?
>>> 
>>> --
>>> David.
>>>> 
>>>> without a tilde (~) at the beginning.
>>>> 
>>>> On Wed, Aug 27, 2014 at 3:34 PM, David Winsemius <dwinsemius at comcast.net> wrote:
>>>>> 
>>>>> On Aug 27, 2014, at 11:19 AM, Gang Chen wrote:
>>>>> 
>>>>>> A random effect formulation for R package nlme is read in as a string
>>>>>> of characters from an input file:
>>>>>> 
>>>>>> ranEff <- "pdCompSymm(~1+Age)"
>>>>>> 
>>>>>> I need to convert 'ranEff' to a formula class. However, as shown below:
>>>>>> 
>>>>>>> as.formula(ranEff)
>>>>>> ~1 + Age
>>>>>> 
>>>>>> the "pdCompSymm" is lost in the conversion. Any solutions?
>>>>> 
>>>>> as.formula(paste("~",ranEff))
>>>>> ~pdCompSymm(~1 + Age)
>>>>> --
>>>>> 
>>>>> David Winsemius
>>>>> Alameda, CA, USA
>>>>> 
>>> 
>>> David Winsemius
>>> Alameda, CA, USA
>>> 
>> 
>> ______________________________________________
>> R-help at 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
Alameda, CA, USA



More information about the R-help mailing list