R:修剪data.tree而不改变

时间:2017-09-05 10:26:11

标签: r object tree pruning

data.tree 包中修剪树时,它会永久性地修改树。这是有问题的,因为我的data.tree需要很长时间才能生成,而且每次我必须进行新的修剪时我都不想生成新的。

这里我生成了一个data.tree

# Loading data and library
library(data.tree)
data(acme)

# Function to add cumulative costs to all nodes
Cost <- function(node) {
  result <- node$cost
  if(length(result) == 0) result <- sum(sapply(node$children, Cost))
  return (result)
}

# Adding costs and other data for my example
acme$Do(function(node) node$cost <- Cost(node), filterFun = isNotLeaf)
acme$IT$Outsource$AddChild("Tester Inc")
acme$IT$Outsource$`Tester Inc`$cost <- 10
print(acme, "p", "cost")
                          levelName    p    cost
1  Acme Inc.                          NA 4950000
2   ¦--Accounting                     NA 1500000
3   ¦   ¦--New Software             0.50 1000000
4   ¦   °--New Accounting Standards 0.75  500000
5   ¦--Research                       NA 2750000
6   ¦   ¦--New Product Line         0.25 2000000
7   ¦   °--New Labs                 0.90  750000
8   °--IT                             NA  700000
9       ¦--Outsource                0.20  400000
10      ¦   °--Tester Inc             NA      10
11      ¦--Go agile                 0.05  250000
12      °--Switch to R              1.00   50000

我在这里修剪树。

# Pruner function
Pruner <- function(node) {
  cost <- node$cost
  cost_parent <- node$parent$cost
  if(cost < 2800000 & cost_parent > 2800000) {
    return(TRUE)
  } else {
    return(FALSE)
  }
}

# Pruning the tree
Prune(acme, function(node) Pruner(node))
print(acme, "p", "cost")
       levelName  p    cost
1 Acme Inc.      NA 4950000
2  ¦--Accounting NA 1500000
3  ¦--Research   NA 2750000
4  °--IT         NA  700000

我试图以多种方式保存我的data.tree对象,但它们最终都会产生巨大的文件,或者花费的时间比从头开始生成新的树要长。

# Saving object
save(acme, file = "acme.RData")
saveRDS(acme, "acme.rds")

# Generating a clone
acme_clone <- Clone(acme)

我的下一个直觉是看看我是否可以使用Get函数暂时修剪树,因为data.tree文档指出有两种变体:临时修剪,例如:仅用于打印:这是pruneFun参数,例如在获取副作用或永久修剪,这意味着你修改data.tree结构是好的。这是通过Prune方法实现的。

由于没有例子,不清楚如何使这项工作。

1 个答案:

答案 0 :(得分:2)

经过一些小小的尝试后,我终于尝试了以下内容,并使其成功。没有好的例子,所以我想我会在这里留下一个。

print(acme, "cost", pruneFun = function(node) Pruner(node)) 
       levelName    cost
1 Acme Inc.      4950000
2  ¦--Accounting 1500000
3  ¦--Research   2750000
4  °--IT          700000