Umut Esen - 2 months ago 25

R Question

I am fairly new to R and currently working on a Shiny web app using RStuido to recognise handwritten digits.

The data I am using is from a Kaggle competition:

Digit-Recogniser

I have the following function to render average representations of digits

`# Produce a plot containing the average representations of digits`

output$digitAvgRep <- renderImage({

## For visualising traing data

dataFrame<-as.matrix(data())

##Color ramp def.

colors<-c('white','red')

cus_col<-colorRampPalette(colors=colors)

## Plot the average image of each digit

par(mfrow=c(4,3),pty='s',mar=c(1,1,1,1),xaxt='n',yaxt='n')

all_img<-array(dim=c(10,28*28))

for(di in 0:9)

{

print(di)

all_img[di+1,]<-apply(dataFrame[dataFrame[,1]==di,-1],2,sum)

all_img[di+1,]<-all_img[di+1,]/max(all_img[di+1,])*255

z<-array(all_img[di+1,],dim=c(28,28))

z<-z[,28:1] ##right side up1

image(1:28,1:28,z,main=di,col=cus_col(256))

}

})

and I pass the above variable to ui.R using:

`# User renderUI to dynamically create objects in the ui.R`

output$tb <- renderUI({

if(is.null(data()))

h5("No data loaded.")

else

tabsetPanel(

tabPanel("About file", tableOutput("filedf")),

tabPanel("RawData", tableOutput("table")),

tabPanel("Summary", tableOutput("sum")),

tabPanel("Digit Distribution",plotOutput("digitDist")),

tabPanel("Average Digit Representation", imageOutput("digitAvgRep")))

})

I get the following output when I run the app:

`[1] 0`

Error in all_img[di + 1, ] <- apply(dataFrame[dataFrame[, 1] == di, -1], :

number of items to replace is not a multiple of replacement length

Anyone know how to solve this?

Thanks

Answer

As the error suggest, you are trying to insert a new vector of length that is shorter than the column that you are placed and the number of items is not a multiple of replacement length

using the following as an example :

```
## create a matrix that is 6 rows and 2 columns
mat <- matrix(1:12, 6,2)
## try to replace first column with a vector of length 3
## works fine because 6 is a multiple of 3
mat[,1] <- 1:3
## try to replace first column with a vector of length 5
## Fails because 6 is not a multiple of 5, try the same exception.
mat[,1] <- 1:5
## number of items to replace is not a multiple of replacement length
```

Hence, you may want to reconsider your apply statement. I will consider creating list to store the results instead of trying to store it in a matrix.