在 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方法实现的。
由于没有例子,不清楚如何使这项工作。
答案 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