我创建了一个生成矩阵的函数,但是我无法弄清楚如何在函数环境之外使这个函数的输出可用,所以我可以将它保存在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)
}
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)}
在这个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"
这正是我所需要的,但我希望能够将此输出导出到csv文件或重新用于进一步操作。但是,当我尝试打印(my.matrix)时,我收到错误消息“错误:对象'my.matrix'未找到”
在我的知识中,我觉得这是一个相当基本的差距,但是一段时间没有与R合作过,也无法解决这个问题。
谢谢! 塞吉
答案 0 :(得分:26)
这很简单:使用<<-
分配给全局。
但话说回来,全球任务是邪恶的,而不是功能性的。也许你宁愿回来
包含您的函数的几个结果的列表?查看您的代码,您的第二个函数似乎可能会混淆return
和print
。确保返回正确的数据结构。
答案 1 :(得分:18)
关于函数式编程。首先,当您定义函数时:
getTitles <- function(pages) {
[...]
return(my.matrix)
print(my.matrix)
}
知道在调用函数时它永远不会到达print
语句。相反,它会在return
之前退出。所以你可以删除那个print
语句,它没用。
现在更重要的东西。在函数内部,您可以定义并返回my.matrix
。该对象仅存在于函数的范围内:当函数退出时,返回的是未命名的对象(并且my.matrix
将丢失。)
在您的会话中,当您致电
时getTitles(mypages)
打印结果是因为您没有分配它。相反,你应该这样做:
out.matrix <- getTitles(mypages)
现在结果将不会打印,但您可以通过在一行中输入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.)
奖励:实际上,我认为您不需要定义getTitles
,但您可以使用其中一个*apply
函数。我会试试这个:
url <- as.character(mypages)
title <- sapply(url, getTitle)
report <- data.frame(url, title)
write.csv(report, file = "report.csv", row.names = FALSE)
答案 2 :(得分: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
答案 3 :(得分:4)
在功能结束时,您可以return
结果。
首先定义函数:
getRangeOf <- function (v) {
numRange <- max(v) - min(v)
return(numRange)
}
然后调用它并将输出分配给变量:
scores <- c(60, 65, 70, 92, 99)
scoreRange <- getRangeOf(scores)
从这里开始,在环境中使用scoreRange
。外部无法访问任何变量或嵌套函数 您定义的函数,除非您使用<<-
来分配全局变量。因此,在此示例中,除非将其设为全局,否则您无法从外部看到numRange
。
通常,尽量避免在早期阶段使用全局变量。变量是“封装的”,因此我们知道在当前上下文中使用哪一个(“环境”)。全局变量更难以驯服。