R - 将数据帧传递给函数

时间:2015-05-21 05:55:22

标签: r function dataframe

R初学者在这里。我试图自己编写一个函数,它有一个数据框作为参数,然后重新排序数据框,然后使用ggplot。我一直在努力尝试让功能发挥作用,不知怎的,我似乎无法找到我正在寻找的答案。

我的第一个代码就是这个,

pareto_plot <- function(pareto_data, title, x_label, y_label, filename){
pareto_calc = pareto_data[order(-pareto_data[2]),]
colnames(pareto_calc) = c("sku", "volume")

pareto_calc$sku_perc = 1/length(pareto_calc$sku)
pareto_calc$sku_cum = cumsum(pareto_calc$sku_perc)

pareto_calc$vol_perc = pareto_calc$volume/sum(pareto_calc$volume)
pareto_calc$vol_cum = cumsum(pareto_calc$vol_perc)

ggplot(pareto_calc, aes(x=pareto_data$sku_cum, y=pareto_data$vol_cum)) +   geom_line(col="blue") + 
geom_line(y=0.8, col="red") +geom_line(x=0.2, col="red") + 
ggtitle(title) + ylab(y_label) + xlab(x_label)

ggsave(paste(filename,".png", sep=""))
}

当我使用上面的代码时,我收到了一个错误,

Error in eval(expr, envir, enclos) : object 'pareto_calc' not found

然后我更改了代码以使用data,因为我看到很多在线示例都使用它作为参数。我现在修改了代码,

pareto_plot <- function(data, title, x_label, y_label, filename){
pareto_data = data

pareto_data[order(-pareto_data[2]),]
colnames(pareto_data) = c("sku", "volume")

pareto_data$sku_perc = 1/length(pareto_data$sku)
pareto_data$sku_cum = cumsum(pareto_data$sku_perc)

pareto_data$vol_perc = pareto_data$volume/sum(pareto_data$volume)
pareto_data$vol_cum = cumsum(pareto_data$vol_perc)

ggplot(pareto_data, aes(x=pareto_data$sku_cum, y=pareto_data$vol_cum)) +   geom_line(col="blue") + 
geom_line(y=0.8, col="red") +geom_line(x=0.2, col="red") + 
ggtitle(title) + ylab(y_label) + xlab(x_label)

ggsave(paste(filename,".png", sep=""))
}

使用此代码,我现在收到错误

Error in exists(name, envir = env, mode = mode) : 
argument "env" is missing, with no default

任何帮助将不胜感激。提前致谢! :)

1 个答案:

答案 0 :(得分:1)

当你创建一个函数时,通常最容易编写代码,而不是使它成为函数,直到你确定它是有效的。然后将其包装为函数。

set.seed(33)

df <- data.frame(V1 = runif(10),
                 V2 = rnorm(10))

pareto_plot <- function(data, title, x_label, y_label, filename){
        pareto_data <- data[order(-data[2]),] #you forgot to assign it

        names(pareto_data)  <-  c("sku", "volume")

        pareto_data$sku_perc  <-  1/length(pareto_data$sku)
        pareto_data$sku_cum <- cumsum(pareto_data$sku_perc)

        pareto_data$vol_perc <- pareto_data$volume/sum(pareto_data$volume)
        pareto_data$vol_cum <- cumsum(pareto_data$vol_perc)

        ggplot(pareto_data, aes(x=sku_cum, y=vol_cum)) +   geom_line(color="blue") + 
                geom_line(y=0.8, col="red") +geom_line(x=0.2, col="red") + 
                ggtitle(title) + ylab(y_label) + xlab(x_label)

        ggsave(paste(filename,".png", sep=""))
}