首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的变量作用域

R中的变量作用域
EN

Stack Overflow用户
提问于 2014-06-23 20:51:18
回答 4查看 98关注 0票数 0

我有一个名为factor_nonagg的data.frame,它有50行3列。我写了一个带参数因子的函数category()。我正在对函数中的因子进行更改。当我将data.frame传递给此函数时,data.frame中没有任何更改。有人能帮我永久更改我的data.frame吗?

代码语言:javascript
复制
n=50
category=function(factors){
for(i in 1:n){
if(factors[i,1]>=90) factors[i,1]<-2*.45
else if(factors[i,1]>=65) factors[i,1]<-1*.45
else factors[i,1]<-0

if(factors[i,2]>=.190) factors[i,2]<-2*.25
else if(factors[i,2]>=.140) factors[i,2]<-1*.25
else factors[i,2]<-0

if(factors[i,3]>=.03) factors[i,3]<-2*.30
else if(factors[i,3]>=.015) factors[i,3]<-1*.30
else factors[i,3]<-0
}}
category(factor_nonagg)
EN

回答 4

Stack Overflow用户

发布于 2014-06-23 21:04:14

R不容易支持函数的按引用传递类型行为。当您在函数中更改参数值时,将创建对象的副本,并且更改仅在函数调用期间有效。

通常,您会让函数返回更改后的值(return(factor)),并将该新值赋给原始变量:

代码语言:javascript
复制
factor_nonagg <- category(factor_nonagg)
票数 1
EN

Stack Overflow用户

发布于 2014-06-24 06:18:36

循环遍历数据帧的行将是极其缓慢的。这是一种矢量化的方法,在没有数据的情况下是不可否认的,但不会对dardisco提供的其他测试数据抛出错误:

代码语言:javascript
复制
category=function(factors){
factors[[1]] <- 0.45*(0:2)[ findInterval(factors[[1]], c(-Inf, 65, 90, Inf) )]
factors[[2]] <- 0.25*(0:2)[ findInterval(factors[[2]], c(-Inf, 0.140, 0.190, Inf) )]
factors[[3]] <- 0.30*(0:2)[ findInterval(factors[[3]], c(-Inf, 0.015, 0.03, Inf) )]
   return(factors) }

当然,与所有函数式语言一样,除非使用赋值命令,否则不会修改factor_agg:

代码语言:javascript
复制
category(factor_agg)                # no effect
factor_agg <- category(factor_agg)  # replacement occurs.

findInterval是一个非常有用的面向向量的函数,它既可以用于返回分组值,也可以用作从一组字符或数值中进行选择的索引(如本例所示

票数 1
EN

Stack Overflow用户

发布于 2014-06-23 21:05:20

您需要在函数中设置一个输出对象,以返回您对df所做的更改。这是通过添加

代码语言:javascript
复制
return(factors)

就在函数定义中的最后一个花括号之前。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24366438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档