粘贴无法识别对象

时间:2015-08-16 16:12:07

标签: r

我正在尝试运行此函数,但是当我尝试编译它时,它会说:

Error in paste("http://uk.advfn.com/p.php?pid=financials&symbol=", Symbol,  : 
  object 'Symbol' not found



fund.data <- function
(
  Symbol,       # ticker 
  n=10,             # number of periods
  mode=c('quarterly','annual'), # periodicity
  max.attempts=5    # maximum number of attempts to download before exiting
)
  dirname(sys.frame(1)$ofile)
{
  all.data = c() 
  option.value = -1

  start_date = c('istart_date,start_date')
  names(start_date) = c('quarterly,annual')

  repeat {
    # download Quarterly Financial Report data
    if(option.value >= 0) {
      url = paste('http://uk.advfn.com/p.php?pid=financials&symbol=', Symbol, '&btn=', mode[1], '_reports&', start_date[mode[1]], '=', option.value, sep = '')  
    } else {
      url = paste('http://uk.advfn.com/p.php?pid=financials&symbol=', Symbol, '&btn=', mode[1], '_reports', sep = '')
    }

    cat('Downloading', url, '\n')

    #txt = join(readLines(url))     
    for(iattempt in 1:max.attempts) { 
      flag = T
      tryCatch({
        txt = join(readLines(url))
      }, interrupt = function(ex) {
        flag <<-  F
        Sys.sleep(0.1)
      }, error = function(ex) {
        flag <<-  F
        Sys.sleep(0.1)
      }, finally = {
        if(flag) break
      })
    }

    if( length(grep('INDICATORS', txt, ignore.case = T)) == 0 ) {
      cat('No Data Found for', Symbol, '\n')
      return(all.data)
    }

    # get title
    pos = regexpr(pattern = '<title>(.*?)</title>', txt, ignore.case = TRUE, perl = TRUE)
    if(length(pos) == 1)
      title = substr(txt, attr(pos, 'capture.start'), attr(pos, 'capture.start') + attr(pos, 'capture.length') - 1)


    # extract table from this page
    data = extract.table.from.webpage(txt, 'INDICATORS', has.header = T)
    colnames(data) = data[1,]
    rownames(data) = data[,1]
    data = data[,-1,drop=F]

    # only add not already present data
    add.index = which( is.na(match( colnames(data), colnames(all.data) )) )         
    all.data = cbind(data[,add.index,drop=F], all.data)

    # check if it is time to stop
    if(ncol(all.data) >= n) break
    if(option.value == 0)  break

    # extract option value to go to the next page
    temp = gsub(pattern = '<option', replacement = '<tr>', txt, perl = TRUE)
    temp = gsub(pattern = '</option>', replacement = '</tr>', temp, perl = TRUE)    
    temp = extract.table.from.webpage(temp, 'All amounts', has.header = T)

    temp = apply(temp,1,join)
    index.selected = grep('selected', temp)
    option.value = 0
    if( length(index.selected) )
      option.value = as.double( gsub('.*value=\'([0-9]*).*', '\\1', temp[index.selected]) ) 

    if(option.value > 0) {
      # can only get 5 time periods at a time
      option.value = option.value - 5
      option.value = max(0, option.value)       
    } else {
      break
    }
  }

  # remove empty columns
  all.data = all.data[, colSums(nchar(trim(all.data))) > 0, drop=F]
  all.data = rbind(all.data, title)
  rownames(all.data)[nrow(all.data)] = 'HTMLTITLEtext'

  if( ncol(all.data) > n ) {    
    return(all.data[,(ncol(all.data)-n+1):ncol(all.data), drop=F])
  } else {
    return(all.data)
  }
}

1 个答案:

答案 0 :(得分:2)

您编写代码的方式,dirname()调用包含函数正文的全部内容。后面的支撑块立即执行,不属于该功能。

运行完所有代码(并收到引用的错误)后,这是fund.data()

fund.data;
## function
## (
##   Symbol,       # ticker
##   n=10,             # number of periods
##   mode=c('quarterly','annual'), # periodicity
##   max.attempts=5    # maximum number of attempts to download before exiting
## )
##   dirname(sys.frame(1)$ofile)

如您所见,支撑块未被视为功能定义的一部分。它在定义fund.data()后立即执行。函数定义仅使用 紧接着的表达式作为正文,尽管该表达式可以包含一个支撑块,它允许将任意数量的语句包含在其中。正如@RichardScriven在他的评论中指出的那样,在你的代码中没有任何实际的函数调用。

因此,你得到确切错误“对象'未找到符号'的原因是因为你的支撑块中不存在函数参数Symbol,因为它不是正文的一部分你的功能并由它自己执行。

要解决您的问题,您需要使用支撑块包围整个函数体:

fund.data <- function
(
    Symbol,       # ticker
    n=10,             # number of periods
    mode=c('quarterly','annual'), # periodicity
    max.attempts=5    # maximum number of attempts to download before exiting
) {
    dirname(sys.frame(1)$ofile)
    all.data = c()
    option.value = -1

    ...

}

虽然不清楚dirname()调用的目的是什么,因为它的返回值没有被使用。