[R] Why do return or visible don´t return my objekt?

Marc Schwartz marc_schwartz at comcast.net
Fri Jan 26 21:16:56 CET 2007


On Fri, 2007-01-26 at 20:23 +0100, Christoph Heibl wrote:
> Dear RRRRRrrrrrrrrlist!

Ruh-Ro....

;-)

> I´ve got two lists which contain sets of DNA-sequences. They look  
> something like this:
> 
> 	List of 33
> 	$ Cunonia_atrorubens                 : chr [1:247] "t" "t" "n" "t" ...
> 	$ Cunonia_balansae                   : chr [1:254] "t" "c" "c" "c" ...
> 	$ Cunonia_capensis                   : chr [1:236] "v" "t" "c" "c" ...
> 	$ Cunonia_macrophylla                : chr [1:236] "t" "t" "a" "t" ...
> 	$ Pancheria_engleriana               : chr [1:315] "c" "t" "c" "c" ...
> 	[....]
> 	$ Brunellia_colombiana               : chr [1:336] "t" "t" "c" "t" ...
> 	$ Brunellia_oliveri                  : chr [1:368] "t" "a" "a" "t" ...
> 	$ Bauera_rubioides                   : chr [1:276] "t" "c" "t" "c" ...
> 	$ Bauera_sessiliflora                : chr [1:332] "t" "c" "t" "c" ...
> 	$ Davidsonia_pruriens_var._jeryseyana: chr [1:300] "t" "t" "c" "t" ...
> 	$ Davidsonia_sp._'johnsonii'         : chr [1:268] "c" "c" "c" "t" ...
> 	- attr(*, "species")= chr [1:33] "Cunonia_atrorubens"  
> "Cunonia_balansae" "Cunonia_capensis" "Cunonia_macrophylla" ...
> 
> 
> The names of each entry in first list match exactly the names of the  
> entries in the second list and both list contain the same number of  
> sequences (although not of the same length)
> I want to concatenate these sequences by the following function:
> 
> 	interleave <- function(seq1, seq2)
> 	{
> 		#create a list to contain concatenated sequences
> 		sequence <- list()			
> 		for (name in names(seq1)) 	# get names as indices
> 			{
> 			# concatenate sequences
> 			sequence[[name]] <- c(seq1[[name]], seq2[[name]])
> 			}
> 	# return concatenated sequences
> 	invisible(sequence)	
> 	}
> 
> I guess the function works in principle, because they commands do so  
> if I enter them step by step.
> But when I call the function it does not return my object "sequence".  
> But why?
> (This happened to me with some functions that I wrote, but not all.  
> The error seems quite erratic : ) to me and I can´t figure out what  
> to change)
> 
> Thanks a lot in advance!
> 
> Christoph

invisible() does just what is says:

Details
This function can be useful when it is desired to have functions return
values which can be assigned, but which do not print when they are not
assigned.


You would have to assign the result of your interleave() function to
another object:

  Res <- interleave(..., ...)


However, there is an easier way to accomplish what you want:

L1 <- as.list(head(iris, 6))
L2 <- as.list(head(iris, 3))

> L1
$Sepal.Length
[1] 5.1 4.9 4.7 4.6 5.0 5.4

$Sepal.Width
[1] 3.5 3.0 3.2 3.1 3.6 3.9

$Petal.Length
[1] 1.4 1.4 1.3 1.5 1.4 1.7

$Petal.Width
[1] 0.2 0.2 0.2 0.2 0.2 0.4

$Species
[1] setosa setosa setosa setosa setosa setosa
Levels: setosa versicolor virginica


> L2
$Sepal.Length
[1] 5.1 4.9 4.7

$Sepal.Width
[1] 3.5 3.0 3.2

$Petal.Length
[1] 1.4 1.4 1.3

$Petal.Width
[1] 0.2 0.2 0.2

$Species
[1] setosa setosa setosa
Levels: setosa versicolor virginica


# Use mapply() to concatenate the two lists

Res <- mapply(c, L1, L2, SIMPLIFY = FALSE)



> Res
$Sepal.Length
[1] 5.1 4.9 4.7 4.6 5.0 5.4 5.1 4.9 4.7

$Sepal.Width
[1] 3.5 3.0 3.2 3.1 3.6 3.9 3.5 3.0 3.2

$Petal.Length
[1] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.4 1.3

$Petal.Width
[1] 0.2 0.2 0.2 0.2 0.2 0.4 0.2 0.2 0.2

$Species
[1] 1 1 1 1 1 1 1 1 1



See ?mapply

HTH,

Marc Schwartz



More information about the R-help mailing list