如何使函数在函数内部可用

Ser*_*sev 20 r function global-variables environment-variables assign

我创建了一个生成矩阵的函数,但是我无法弄清楚如何在函数环境之外使这个函数的输出可用,所以我可以将它保存在csv文件中.

我的功能代码如下:

创建了从特定网站获取网址并返回网页标题的功能:

getTitle <- function(url) {
  webpage <- readLines(url)
  first.row <- webpage[1]
  start <- regexpr("<title>", first.row)
  end <- regexpr("</title>", first.row)
  title <- substr(first.row,start+7,end-1)
  return(title)
}
Run Code Online (Sandbox Code Playgroud)

创建了一个函数,它接受url的向量并返回带有url和页面标题的n*2矩阵:

getTitles <- function(pages) {
  my.matrix <- matrix(NA, ncol=2, nrow=nrow(pages))
  for (i in seq_along(1:nrow(pages))) {
    my.matrix[i,1] <- as.character(pages[i,])
    my.matrix[i,2] <- getTitle(as.character(pages[i,])) }
  return(my.matrix)
  print(my.matrix)}
Run Code Online (Sandbox Code Playgroud)

http://goo.gl/D9lLZ上的示例文件上运行此函数后,我使用read.csv函数导入并命名为"mypages",我得到以下输出:

getTitles(mypages)
     [,1]                                               [,2]                                                
[1,] "http://support.google.com/adwords/answer/1704395" "Create your first ad campaign - AdWords Help"      
[2,] "http://support.google.com/adwords/answer/1704424" "How costs are calculated in AdWords - AdWords Help"
[3,] "http://support.google.com/adwords/answer/2375470" "Organizing your account for success - AdWords Help"
Run Code Online (Sandbox Code Playgroud)

这正是我需要的,但我希望能够将此输出导出到csv文件或重用以进行进一步的操作.但是,当我尝试打印(my.matrix)时,我收到错误消息"错误:对象'my.matrix'未找到"

在我的知识中,我觉得这是一个相当基本的差距,但是有一段时间没有与R合作,也无法解决这个问题.

谢谢!谢尔盖

Dir*_*tel 28

这很简单:<<-用于分配给全局.

但话说回来,全球任务是邪恶的,而不是功能性的.也许你宁愿返回一个包含你的函数的几个结果的列表?看看你的代码,似乎你的第二个功能可能会混淆returnprint.确保返回正确的数据结构.

  • 为什么全球任务是邪恶而不是功能? (6认同)

flo*_*del 17

关于函数式编程.首先,在定义函数时:

getTitles <- function(pages) {
  [...]
  return(my.matrix)
  print(my.matrix)
}
Run Code Online (Sandbox Code Playgroud)

知道在调用函数时它永远不会到达print语句.相反,它将在之前退出return.所以你可以删除那个print语句,这是没用的.

现在更重要的东西.在函数内部,您可以定义并返回my.matrix.该对象仅存在于函数的范围内:当函数退出时,返回的是未命名的对象(并且my.matrix丢失了.)

在你的会话中,当你打电话

getTitles(mypages)
Run Code Online (Sandbox Code Playgroud)

打印结果是因为您没有分配它.相反,你应该这样做:

out.matrix <- getTitles(mypages)
Run Code Online (Sandbox Code Playgroud)

现在结果将不会打印,但您可以通过键入print(out.matrix)或仅out.matrix在一行上进行打印.并且因为您已将结果存储在对象中,所以现在可以将其重用于进一步的操作.

如果它帮助您掌握概念,这c()与从命令行调用函数完全相同:

c(1, 5, 2)      # will return and print a vector 
x <- c(1, 5, 2) # will return and assign a vector (not printed.)
Run Code Online (Sandbox Code Playgroud)

奖励:真的,我认为你不需要定义getTitles,但你可以使用其中一个*apply功能.我会试试这个:

url    <- as.character(mypages)
title  <- sapply(url, getTitle)
report <- data.frame(url, title)
write.csv(report, file = "report.csv", row.names = FALSE)
Run Code Online (Sandbox Code Playgroud)


vas*_*s85 7

你不能只用<<-它来将对象分配给工作区吗?以下代码适用于我并保存amort_value对象.

amortization <- function(cost, downpayment, interest, term) {
  amort_value <<- (cost)*(1-downpayment/100)*(interest/1200)*((1+interest/1200)^(term*12))/((1+interest/1200)^(term*12)-1)
  sprintf("$%.2f", amort_value)         

}
amortization(445000,20,3,15)
amort_value
Run Code Online (Sandbox Code Playgroud)


Ten*_*g L 6

在函数的最后,您可以return得到结果。

首先定义函数:

getRangeOf <- function (v) {
    numRange <- max(v) - min(v)
    return(numRange)
}
Run Code Online (Sandbox Code Playgroud)

然后调用它,并将输出分配给变量:

scores <- c(60, 65, 70, 92, 99)
scoreRange <- getRangeOf(scores)
Run Code Online (Sandbox Code Playgroud)

从这里开始scoreRange在环境中使用。任何变量或嵌套函数你定义的函数不是外部访问,当然,除非你使用<<-分配一个全局变量。因此,在此示例中,numRange除非将其全局设置,否则无法从外部看到什么。

通常,请尽早避免全局变量。变量是“封装的”,因此我们知道在当前上下文(“环境”)中使用了哪个变量。全局变量更难处理。