2014-09-17 13 views
5

Per un incarico, dobbiamo disegnare un albero di Natale in R. Ho cercato su internet e ho trovato alcuni utili consigli, ma alla fine della giornata, non so come per procedere e sperare che qualcuno mi possa aiutare.R: Albero di Natale

Questo è il mio codice finora.

#ctree: prints a Christmas tree on screen with size N 
ctree <- function(N){ 
for (i in 1:N){ 
    width = sample("*",i,replace=T) 
    cat(width,sep="-","\n") 
    } 
cat(width[1],"\n") 
} 

Questo mi lascia con il lato centrale ea destra del mio albero (con N = 4), che è grande, ma non abbastanza.

*- 
*-*- 
*-*-*- 
*-*-*-*- 
* 

ho pensato di invertire quello che avevo (fondamentalmente destro allineando il prodotto della funzione) per creare il lato sinistro, successivamente eliminare la colonna più a destra del lato sinistro e la colla insieme con il lato destro della albero, creando un albero di Natale.

Spero davvero che qualcuno possa aiutarmi a raggiungere questo obiettivo! In attesa di un vostro consiglio.

Grazie in anticipo.

+0

Perché usate 'sample' per questo? 'Rep' sembra una scelta migliore. Inoltre, sei quasi arrivato. Cambia '*' e '_' nel tuo codice e regola la frequenza con cui viene ripetuto' _'. – Roland

+0

Hai provato il piano che hai menzionato? Se sì, qualcosa è andato storto? Non dovremmo fare i compiti, ma possiamo aiutarti con gli errori che incontri. –

+0

Ispirazione: [Code Golf Christmas Edition: Come stampare un albero di Natale di altezza N] (http://codegolf.stackexchange.com/questions/4244/code-golf-christmas-edition-how-to-print-out -a-christmas-tree-of-height-n) –

risposta

3

Per chiunque fosse interessato: questo è quello che ho finito per fare in R per creare un albero di Natale.

#ctree: prints a Christmas tree on screen with amount of branch levels N 
ctree <- function(N){ 
filler = "*" 
blank = "" 

for (i in 1:N){ 
    row = c(sample(blank,N-i,replace=T),sample(filler,i,replace=T),sample(blank,N-i,replace=T)) 
    cat(row,"\n") 
    } 
cat(c(sample(blank,(N-1),replace=T),sample(filler,1,replace=T),sample(blank,(N-1),replace=T)),"\n") 
} #ctree 

Questo è il risultato! Il mio piccolo albero felice (o grande, qualunque cosa galleggi la tua barca).

enter image description here

+0

Non dovresti usare 'sample' per ripetere un valore n volte, quella funzione dovrebbe essere usata per campionare casualmente n-times da un set. Usa 'rep (valore, ntimes)' invece ... – digEmAll

+0

Sì, @digEmAll, Roland me l'ha fatto notare prima, ma ho visto quel commento solo dopo aver fatto questa funzione. Sono assolutamente d'accordo, tuttavia, il rappresentante è molto meglio e molto più appropriato. (: –

1

Questo codice è venuto da qualcun altro. Vorrei poterli accreditare ma ho perso la fonte. L'albero che produce è bello e forse potresti modificarlo per i tuoi scopi.

part <- list(x0=0,y0=0,x1=0,y1=1, 
      branch1=NULL,branch2=NULL,extend=NULL, 
      lwd=1,depth=0,col='springgreen') 

par(mfrow=c(1,1),mar=c(5, 4, 4, 2) + 0.1) 
segplot <- function(tree) { 
    if (is.null(tree)) return() 
    segments(tree$x0,tree$y0,tree$x1,tree$y1, 
      col=tree$col, 
      lwd=tree$lwd) 
    segplot(tree$branch1) 
    segplot(tree$branch2) 
    segplot(tree$extend) 
} 
#segplot(part) 

grow <- function(tree) { 
    if (is.null(tree)) return(NULL) 

    tree$lwd=tree$lwd*1.2 
    if (tree$lwd>2.5) tree$col <- 'brown' 
    if (is.null(tree$extend)) { 
    tree$extend <- list(
     x0=tree$x1, 
     y0=tree$y1, 
     x1=rnorm(1,1,.03)*(2*tree$x1-tree$x0), 
     y1=(rnorm(1,.98,.02)+.02*(tree$x1==tree$x0))*(2*tree$y1-tree$y0), 
     branch1=NULL, 
     branch2=NULL, 
     extend=NULL, 
     lwd=1, 
     depth=tree$depth, 
     col=tree$col 
    ) 
    length=sqrt((tree$x1-tree$x0)^2 + (tree$y1-tree$y0)^2) 
    angle <- asin((tree$x1-tree$x0)/length) 
    branch <- list(
     x0=(tree$x1+tree$x0)/2, 
     y0=(tree$y1+tree$y0)/2, 
     branch1=NULL, 
     branch2=NULL, 
     extend=NULL, 
     lwd=1, 
     depth=tree$depth, 
     col=tree$col 
    ) 
    shift <- rnorm(2,.5,.1) 
    branch$x0 <- shift[1]*tree$x1+(1-shift[1])*tree$x0 
    branch$y0 <- shift[1]*tree$y1+(1-shift[1])*tree$y0 
    length=length*rnorm(1,.5,.05) 
    co <- runif(1,.35,.45) 
    branch$x1 <- branch$x0+sin(angle+co)*length 

    branch$y1 <- branch$y0+cos(angle+co)*length 
    tree$branch1 <- branch 
    branch$x0 <- shift[2]*tree$x1+(1-shift[2])*tree$x0 
    branch$y0 <- shift[2]*tree$y1+(1-shift[2])*tree$y0 
    co <- runif(1,.35,.45) 
    branch$x1 <- branch$x0+sin(angle-co)*length 
    branch$y1 <- branch$y0+cos(angle-co)*length 
    tree$branch2 <- branch  
    } else { 
    tree$branch1 <- grow(tree$branch1) 
    tree$branch2 <- grow(tree$branch2) 
    tree$extend <- grow(tree$extend) 
    } 
    tree$depth <- tree$depth+1 
    if (tree$depth>2) tree$col <- 'green' 
    if (tree$depth>4) tree$col <- 'darkgreen' 
    if (tree$depth>6) tree$col <- 'brown' 

    tree 
} 
tree <- part 
for (i in 1:9) tree <- grow(tree) 
par(mar=c(0,0,0,0)) 
plot(x=c(-3,3),y=c(0,9),type='n',axes=FALSE,xlab='',ylab='') 
segplot(tree) 
+0

Una volta penso di averlo visto su R-bloggers Sono stato stupito –

+0

Wow, questo albero è bellissimo Grazie per aver condiviso. (: –

+0

Ecco la fonte: http://wiekvoet.blogspot.de/2013/ 12/merry-christmas.html – vonjd

0

Ecco una versione più sintetica:

ctree <- function(N=10){ 
    for (i in 1:N) cat(rep("",N-i+1),rep("*",i),"\n") 
    cat(rep("",N),"*\n") 
} 

ctree()