【发布时间】:2019-04-16 11:02:40
【问题描述】:
在闪亮的 server 函数中,我必须针对不同的输入(列名)重复以下步骤,例如 'LGD-Class':
#Begin the server.R
function(input, output) {
.
.
.
if(dataRating() == "LGD-Class"){
data1<- data[,list('MW (%)'=sum(as.numeric(Marktwert))/mw.ganz),by='LGD-Class']
data2<- data[,list('EL (%)'=sum(as.numeric(`EL absolut`))/EL.ganz),by='LGD-Class']
data3<- data[,list('VaR (%)'=sum(`VaR Beitrag absolut`)/Var.ganz),by='LGD-Class']
# absolute values
data5<-data[,list(MW.Abs=sum(as.numeric(Marktwert))),by='LGD-Class']
data6<-data[,list(EL.Abs=sum(as.numeric(`EL absolut`))),by='LGD-Class']
data7<- data[,list(VaR.Abs=sum(`VaR Beitrag absolut`)),by='LGD-Class']
# relative values
data4<-merge(data1,data2,by='LGD-Class')
data.rel<-merge(data4,data3,by='LGD-Class')
# absolute values
data8<-merge(data5,data6,by='LGD-Class')
data.abs<-merge(data8,data7,by='LGD-Class')
data<-merge(data.rel,data.abs,by='LGD-Class')
}...
} #end of server.R
因此我在 server 函数中编写了一个函数(紧接在 server.R 的开头),其中变量 'LGD-Class' 被通用变量 x 替换:
my.aggregate<-function(x,data){x.c<-as.character(x)
if(dataRating() ==x.c){
va=get(x)
data1<- data[,list('MW (%)'=sum(as.numeric(Marktwert))/mw.ganz),by=va]
data2<- data[,list('EL (%)'=sum(as.numeric(`EL absolut`))/EL.ganz),by=va]
data3<- data[,list('VaR (%)'=sum(`VaR Beitrag absolut`)/Var.ganz),by=va]
# absolute values
data5<-data[,list(MW.Abs=sum(as.numeric(Marktwert))),by=va]
data6<-data[,list(EL.Abs=sum(as.numeric(`EL absolut`))),by=va]
data7<- data[,list(VaR.Abs=sum(`VaR Beitrag absolut`)),by=va]
# relative values
data4<-merge(data1,data2,by=va)
data.rel<-merge(data4,data3,by=va)
# absolute values
data8<-merge(data5,data6,by=va)
data.abs<-merge(data8,data7,by=va)
data<-merge(data.rel,data.abs,by=va)
return(data)
}}
data作为函数变量,指的是我调用my.aggregate之前读取的数据框
data<-fread(paste0('C:/Users/data/','31032019KRB.CSV'),header=TRUE, sep=";",stringsAsFactors = FALSE)
mw.ganz<-sum(as.numeric(data$MV))
Var.ganz<-sum(as.numeric(data$`VaR absolut`))
EL.ganz<-sum(as.numeric(data$`EL absolut`))
my.aggregate("LGD-Class",data)
我收到以下错误:
Warning in is.na(data) :
is.na() applied to non-(list or vector) of type 'closure'
Warning: Error in get: object 'LGD-Class' not found
任何想法,我该如何解决这个问题?问题是我同时使用character (" ") 和variable name (' ') 吗?
我不想引入/使用全局变量!
【问题讨论】:
-
以防万一,这个函数是否声明在
shinyServer包装之上?以及shinyServer中的LGD-Class? -
一切都发生在服务器函数中,包括函数的声明和调用函数 my.aggregate("LGD-Class",data)
-
似乎“LGD-Class”在此功能范围内不可用。试试
get("LGD-Class", envir = .GlobalEnv)。强制get查看全局环境。如果这不起作用,请尝试其他envir参数。 -
如果可以避免全局变量和函数,我们将不胜感激!
-
我建议你找到
get在哪个范围内查找,以及LGD-Class声明在哪个范围内。这里有一个关于环境的很好的参考:adv-r.had.co.nz/Environments.html.