[R] Issue with formula conversion

Richard M. Heiberger rmh at temple.edu
Wed Aug 27 22:47:37 CEST 2014


David,

you caught my typo of excess quotation marks.  this should work

ranEff1 <- ~Variety -1
random=list(Block=get(BlockFunction)(ranEff1)))

On Wed, Aug 27, 2014 at 4:41 PM, David Winsemius <dwinsemius at comcast.net> wrote:
>
> 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