2014-09-17 10 views
5

Để phân công, chúng ta cần vẽ một cây thông Noel ở R. Tôi đã tìm kiếm trên internet và tìm thấy một số lời khuyên hữu ích, nhưng vào cuối ngày, tôi không biết làm thế nào để tiếp tục và hy vọng ai đó có thể giúp tôi.R: Cây Giáng sinh

Đây là mã của tôi cho đến thời điểm này.

#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") 
} 

Điều này khiến tôi ở giữa và bên phải của cây (với N = 4), rất tuyệt, nhưng không đủ.

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

tôi lên kế hoạch trên đảo ngược những gì tôi đã có (về cơ bản phải sắp xếp các sản phẩm của hàm) để tạo ra ở phía bên trái, sau đó xóa các cột ngoài cùng bên phải của phía bên trái và dán nó cùng với phía bên phải của cây, tạo cây thông Noel.

Tôi thực sự hy vọng rằng ai đó có thể giúp tôi đạt được điều này! Rất mong nhận được lời khuyên của bạn.

Xin cảm ơn trước.

+0

Tại sao bạn sử dụng 'sample' cho việc này? 'rep' có vẻ như là một lựa chọn tốt hơn. Ngoài ra, bạn gần như ở đó. Chuyển '*' và '_' trong mã của bạn và điều chỉnh tần suất' _' được lặp lại. – Roland

+0

Bạn đã thử kế hoạch bạn đã đề cập chưa? Nếu vậy, có điều gì sai? Chúng tôi không nên làm bài tập ở nhà của bạn, nhưng chúng tôi có thể giúp bạn khắc phục các lỗi mà bạn gặp phải. –

+0

Cảm hứng: [Code Golf Christmas Edition: Cách in ra cây thông Noel có chiều cao N] (http://codegolf.stackexchange.com/questions/4244/code-golf-christmas-edition-how-to-print-out -a-christmas-tree-of-height-n) –

Trả lời

3

Đối với bất kỳ ai quan tâm: đây là những gì tôi đã làm trong R để tạo cây thông Noel.

#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 

Đây là kết quả! Cây hạnh phúc nhỏ của tôi (hoặc lớn, bất cứ điều gì nổi thuyền của bạn).

enter image description here

+0

Bạn không nên sử dụng 'mẫu' để lặp lại một giá trị n lần, hàm đó được cho là được sử dụng để lấy mẫu ngẫu nhiên n lần từ một tập hợp. Sử dụng 'rep (value, ntimes)' thay vào đó ... – digEmAll

+0

Yeah, @digEmAll, Roland đã chỉ ra cho tôi trước đó, nhưng tôi chỉ thấy nhận xét đó sau khi tôi đã thực hiện chức năng này. Tôi hoàn toàn đồng ý mặc dù, đại diện là tốt hơn và thích hợp hơn nhiều. (: –

1

Mã này đến từ một người khác. Tôi ước tôi có thể ghi nhận họ nhưng tôi đã mất nguồn. Cây nó tạo ra là đẹp, và có lẽ bạn có thể sửa đổi nó cho mục đích của bạn.

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

Tôi nghĩ rằng tôi đã thấy điều này trên R-blogger một lần. Tôi đã ngạc nhiên –

+0

Wow, cây này là đẹp.Cảm ơn bạn đã chia sẻ. (: –

+0

Đây là nguồn: http://wiekvoet.blogspot.de/2013/ 12/merry-christmas.html – vonjd

0

Đây là một phiên bản ngắn gọn hơn:

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

ctree() 
Các vấn đề liên quan