[R] Lists and Binary Operators.

Prof Brian Ripley ripley at stats.ox.ac.uk
Wed Oct 19 07:53:45 CEST 2005


On Wed, 19 Oct 2005, Narcyz Ghinea wrote:

>
> Dear R Users,
>
> Any insights into why the following occurs would be helpful....
>
> Firstly:
>
> #Evaluating proportions
> p<-as.list(rep(0,times=length(n))) #creating object of appropriate size.
> for(j in 1:length(n)){
> for(k in 1:length(n[[j]])){
> p[[j]][[k]]<- (s[[j]][[k]]/n[[j]][k])}} # 31 x k x num_samples(dim)
> where k varies
>
> The list object s[[j]][[k]] has 3 levels, j, k, and i. j represents the
> review number, k the study number in that review, and i is the number of
> simulations in that study.  n[[j]][k] is also a list object with 2
> levels that represents the number of patients in study k of review j.
>
> When I run this the following error message occurs:
>
> Error: more elements supplied than there are to replace.
>
> However, if I make the simple adjustment p[[j]][[k]]<-
> list(s[[j]][[k]]/n[[j]][k]) it works fine! If anyone knows why please
> let me know. I couldn't get the answer from reading the "list" help.

Hmm.  Take a look at p: it is a list of numerical items of length 1, and 
you are trying to replace p[[j]][[k]], a single element in a numeric 
vector, by a numeric vector of length > 1.

I think you need to set p up properly, most likely as a copy of s.

> Secondly:
>
> #Evaluating weights.
> w<-as.list(rep(0,times=length(n))) #creating object of appropriate size.
> for(j in 1:length(n)){
> for(k in 1:length(n[[j]])){
> w[[j]][[k]]<- (1/(p[[j]][[k]]*n[[j]][k]*(1-p[[j]][[k]])))}} # 31 x k x
> num_samples(dim) where k varies
>
> When I run this section of the code, if gives the same error message as
> the previous one. When I try to solve it using the "list" function
> again, instead it gives a different error message:
>
> Error in p[[j]][[k]] * n[[j]][k] : non-numeric argument to binary
> operator
>
> The error message is straightforward but what I can't understand is why
> an error trying to calculate  p[[j]][[k]]*n[[j]][k] in the second case,
> but no such problem evaluating s[[j]][[k]]/n[[j]][k] in the first case,
> even though they are objects of the same type and sizes?

Have you verified that claim?  I think p[[j]][[k]] is a list, which is 
what you assigned there, and s[[j]][[k]] is a numeric vector.

Compare str(p) to str(s).

> How can I get rid of the second error? I have tried converting the
> p[[j]][[k]] vector into the numeric type but it won't allow it.

Had you quoted the error message your mistake would have been much more 
obvious.  I suspect it says

     (list) object cannot be coerced to 'double'

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595




More information about the R-help mailing list