2013-09-11 58 views
3

我遇到了一个奇怪的问题(我是R的新手)。我试图创建一个功能如下:语句没有在一个函数内执行,独立执行

library(ggplot2) 
median_confidence_interval <- function(x) { 
    quart_list<-c() 
    return_data<-data.frame(lower_ci=0,median=0,upper_ci=0) 
    for(i in 1:1000){ 
    y<-x[as.integer(runif(length(x), min = 1, max = length(x) + 1))] 
    median<-median(y) 
    quart_list=c(quart_list,median) 
    } 
    return_data$median<-median(quart_list) 
    return_data$lower_ci<-quantile(quart_list,probs=0.025) 
    return_data$upper_ci<-quantile(quart_list,probs=0.975) 
    p <- ggplot() 
    p <- p + geom_density(aes(x=x)) + geom_density(aes(x=quart_list)) 
    p <- p + geom_vline(aes(xintercept = return_data$median, color='red')) 
    p <- p + geom_vline(aes(xintercept = return_data$lower_ci, color='blue')) 
    p <- p + geom_vline(aes(xintercept = return_data$upper_ci, color='green')) + coord_cartesian(xlim = c(min(x),max(x))) 
    png("density_confidence_internal.png") 
    plot(p) 
    dev.off() 
    return_data 
} 

在这段代码中,我只是试图创建一个图并保存它。尽管我可以独立执行这些语句中的每一个,但不在函数内部。该函数编译没有错误,但运行该函数时它说'未找到'quart_list'。 如果quart_listreturn_data存在于工作区中,那么我可以执行该功能并获得结果。当我清除工作区并执行该函数时,我在运行时遇到了相同的错误(不编译)。

另一个问题是当我调用函数median_confidence_interval(x)时,它期望我只提供'x'作为参数,它不需要像median_confidence_interval(possum$earconch)之类的东西。为什么会这样?

请问有人能指出我的方向吗?

+0

你可以包含错误的文本以及你的一些数据'x'。此外,由于您冒着破坏用户定义函数的风险,因此指定'median < - median(y)'不是最佳做法。 – Justin

+0

我认为你应该首先调试for-loop。看起来你是来自SAS或SPSS等面向行业的宏语言的难民。行索引需要在R中的for循环中明确。 –

+0

@Dinin - 你是对的,我有一些C#和python的经验,但不是SAS,SPSS。 R完全陌生,觉得很奇怪,但仍然在努力学习。关于我问的问题,完全相同的代码在另一个系统(MAC)上工作。我不确定这是否是R的一个常见问题,但我注意到了n个工作在一个系统而不工作在另一个系统上的位。很奇怪 !! – Patthebug

回答

0

ggplot对象的环境评价有点神秘。但是,如果您记得ggplot想要data.frames传递给data参数,并且aes中的值应该是data.frame的列,那么通常会避免出现问题。

为了调试这样的事情,我发现将print语句插入到函数中很有帮助,以便理清我得到的内容。 (见注释行)

调整你的函数据此得出:

median_confidence_interval <- function(x) { 
    quart_list<-c() 
    return_data<-data.frame(lower_ci=0,median=0,upper_ci=0) 
    for(i in 1:1000){ 
    y<-x[as.integer(runif(length(x), min = 1, max = length(x) + 1))] 
    median<-median(y) 
    # print ('inside for loop') 
    quart_list=c(quart_list,median) 
    } 

    # print('past for loop') 
    return_data$median<-median(quart_list) 
    return_data$lower_ci<-quantile(quart_list,probs=0.025) 
    return_data$upper_ci<-quantile(quart_list,probs=0.975) 

    # print('start of ggplot code') 
    foo=data.frame(q=quart_list, x=x) 
    p <- ggplot() 
    p <- p + geom_density(data=foo, aes(x=x)) + geom_density(data=foo, aes(x=q)) 
    # print('past first quart_list reference in ggplot') 
    p <- p + geom_vline(data=return_data, aes(xintercept = median, color='red')) 
    p <- p + geom_vline(data=return_data, aes(xintercept = lower_ci, color='blue')) 
    p <- p + geom_vline(data=return_data, aes(xintercept = upper_ci, color='green')) + coord_cartesian(xlim = c(min(x), max(x))) 
    png("/tmp/density_confidence_internal.png") 
    plot(p) 
    dev.off() 
    return_data 
} 

另外,我觉得@DWin在他的评论好点!

+0

感谢您的建议..完全相同的代码适用于另一个系统(MAC)。我不确定这是否是R的一个常见问题,但是我注意到n个R代码段在一个系统中工作,而不是在另一个系统上工作。很奇怪 !! – Patthebug