我有以下代码在R解释器中按预期工作
recodeRule <- function(df, rules){
for(i in 1:nrow(rules)){
x <- which(df$key == rules$key[i] & df$score == rules[i, 'before'])
df[x, 'score'] <- rules[i, 'after']
}
df
}
df <- data.frame(key = c(1,2,3,1,2,3), score = c(1,1,2,2,1,1))
rules <- data.frame(key = c(1,2), before = c(1,1), after = c(10,12))
recodeRule(df, rules)
然而,当我的Shiny应用程序中放置相同的代码时,我得到&#34; $运算符对原子向量无效#34;。追溯显示:
Stack trace (innermost first):
113: which [Rcode/serverFiles/testScoring.R#30]
112: recodeRule [Rcode/serverFiles/testScoring.R#30]
111: <reactive:stuItems4Scoring> [Rcode/serverFiles/testScoring.R#35]
100: stuItems4Scoring
99: get
98: <reactive:dimVarNms> [Rcode/serverFiles/testScoring.R#132]
87: dimVarNms
86: lapply
85: listify
84: choicesWithNames
83: selectInput
82: tagAppendChild
81: selectizeIt
80: selectizeInput
79: renderUI [Rcode/serverFiles/testScoring.R#137]
78: func
77: origRenderFunc
76: output$dimVars4Scoring
1: runApp
该函数嵌入在此反应式表达式中。此函数的预期行为是读入并返回文件。如果读入第二个文件,它将修改该文件并返回它。
stuItems4Scoring <- reactive({
validate(need(input$stuItems4Scoring != "", ""))
infile <- input$stuItems4Scoring
if (!is.null(input$stuItems4Scoring)) {
file <- load(input$stuItems4Scoring$datapath, e6)
}
### Apply recode if requested
if(!is.null(input$recodeRules)){
rules <- recodeFile()
file <- recodeRule(file, rules)
return(file)
} else {
file
}
})
以及在rules
文件中读取的代码部分如下:
recodeFile <- reactive({
validate(need(input$recodeRules != "", ""))
infile <- input$recodeRules
if (is.null(infile)) return(NULL)
read.csv(infile$datapath)
})
如果我没有在recodeFile
中阅读,那么实际应用程序的相关部分将按预期工作,因为返回原始daatframe。但是,当我在recodeFile
中读到时,它应该发生什么呢?它应该修改数据(如上面提供的工作示例,在R解释器中工作)并返回修改后的文件。这是我的代码失败的地方,我不确定原因。
回溯表明有问题的代码行位于which
函数中的recodeRule
语句中,但我根本没有看到原因,因为我有点在此时杂草丛生。
感谢您的支持。
答案 0 :(得分:0)
我在使用rgl软件包的Shiny中遇到了类似的问题。我在server.R和ui.r文件的rglwidgetOutput()中使用了renderRglwidget()函数。
然后,通过在renderRglwidget()函数的expr参数的末尾添加一行来解决此问题。该行是:rglwidget()