当我为col_num传递int时,以下代码有效:
makeHRdata = function(Test, model, col_num) {
means = 1:length(Test)
for (i in 1:length(Test)) means[i] = mean(Test[,i])
TestCopy = Test[1,]
TestCopy[1,] = t(means)
pdpHR = range(Test[col_num])
for (i in range(Test[col_num])[1]:range(Test[col_num])[2]) {
TestCopy[1,col_num] = i
pdpHR[i] = predict(model,TestCopy)
}
return(pdpHR)
}
我希望用户能够在checkboxGroupInput中选择col_num(允许多次调用此函数)。
我可以使用checkboxGroupInput打印出用户的输入,如下所示:
output$text5 <- renderText({
paste( "The object you selected is ",
input$select_columns2)
})
因此,输入$ select_columns2包含一个列名称的字符串。
我尝试重写该函数以合并字符串而不是int作为列名:
makeHRdata = function(Test, model, col_num) {
means = 1:length(Test)
for (i in 1:length(Test)) means[i] = mean(Test[,i])
TestCopy = Test[1,]
TestCopy[1,] = t(means)
pdpHR = range(Test$col_num)
for (i in range(Test$col_num)[1]:range(Test$col_num)[2]) {
#TestCopy[1,col_num] = i
TestCopy$col_num[1] = i
pdpHR[i] = predict(model,TestCopy)
}
return(pdpHR)
}
我用这个来调用这个函数:
reactiveHRdata = reactive({
makeHRdata(get(input$select_test_data2),eecs,input$select_columns2)
})
我尝试这个时得到的错误是: 范围错误(Test $ col_num)[1]:范围(Test $ col_num)[2]: 结果将是一个太长的向量
范围是0到63,这当然不会太长。&#34;当我使用int指定列时,我不会收到此错误。
另外,我通过写一个列名而不是使用变量col_num来测试我的新函数,它运行得很好。 (HR是列名。):
makeHRdata = function(Test, model, col_num) {
means = 1:length(Test)
for (i in 1:length(Test)) means[i] = mean(Test[,i])
TestCopy = Test[1,]
TestCopy[1,] = t(means)
pdpHR = range(Test$HR)
for (i in range(Test$HR)[1]:range(Test$HR)[2]) {
TestCopy$HR[1] = i
pdpHR[i] = predict(model,TestCopy)
}
return(pdpHR)
}
知道如何将列名称作为字符串传递并使一切正常工作吗?非常感谢!
答案 0 :(得分:1)
这是一个有趣的错误。请参阅此说明:
> df <- data.frame(a = 1:10)
> range(df$b)
[1] Inf -Inf
Warning messages:
1: In min(x, na.rm = na.rm) :
no non-missing arguments to min; returning Inf
2: In max(x, na.rm = na.rm) :
no non-missing arguments to max; returning -Inf
显然,当你致电Test$col_num
时,它无法识别col_num
是变量。它搜索“col_num”列NULL
。 range
变为[-Inf,Inf]并且您没有看到警告,因为它是在函数环境中执行的。当然,向量-Inf:Inf
太大了。
以下是修复(以及通过变量调用列的方式):使用 Test[[col_num]]
而不是Test$col_num
。