Saya menulis sebuah fungsi, menghasilkan persediaan, yang menghasilkan pengiriman beberapa produk ke toko. Artinya, fungsi tersebut bekerja dengan membuat file teks dengan dua kolom: hari dalam sebulan (atau minggu, dekade) dan nilai produk, dengan menggunakan generator bilangan acak sehingga nilai produk pada hari yang berbeda berbeda. Parameter fungsi: nama file, lokasi, nilai maksimum dan minimum, jumlah hari. Masalahnya adalah saya menggunakan fungsi ini untuk membuat data pengiriman dan penjualan ke toko, dan penjualan saya melebihi pengiriman. Saya mencoba mengonfigurasinya melalui parameter maksimum dan minimum, tetapi tidak berhasil. Bagaimana saya bisa memecahkan masalah ini? Berikut adalah kode:

generate.supply<-  function(way='',
                            file.name='Supply',
                            days=7,
                            min=100,
                            max=140,
                            goods='Milk, packaging'){

  #creating a table from a single column with a length of days
  tabl<-data.frame('Day'=1:days)
  #use the colnames()function to create a column header
  #adding columns for each product
  for(i in 1:length(goods)){
    tabl[i+1]<-sample(x=min[i]:max[i], size = days)
    colnames(x=tabl)[i+1]=goods[i]
  }
 #write this table to a file with the extension txt
  write.table(
    x=tabl,
    file= paste0(way,file.name),
    col.names = TRUE,
    row.names = FALSE
  )
 return(tabl) 
}
generate.supply(way = "", file.name= 'Shop1_in_K',days=7,goods = c('Cottage cheese, pcs','Kefir, pcs', 'Sour cream, pcs'),min=c(85,100,110),max=c(110,120,130))# generating delivery
generate.supply(way = "", file.name= 'Shop1_out_K',days=7,goods = c('Cottage cheese, pcs','Kefir, pcs', 'Sour cream, pcs'),min=c(85,100,110),max=c(105,119,125))# generating sales
0
sjr_25 21 Mei 2021, 13:24

1 menjawab

Jawaban Terbaik

Satu solusi cepat dan jelek. Fungsi Anda harus mengetahui nilai maksimum per hari.

generate.supply<-  function(way='',
                            file.name='Supply',
                            days=7,
                            min=100,
                            max=140,
                            goods='Milk, packaging',
                            deliver=NULL){
  
  #creating a table from a single column with a length of days
  tabl<-data.frame('Day'=1:days)
  #use the colnames()function to create a column header
  #adding columns for each product
  for(i in 1:length(goods)){
    tabl[i+1]<-sample(x=min[i]:max[i], size = days)
    colnames(x=tabl)[i+1]=goods[i]
  }
  
  if (!is.null(deliver)) {
    tabl <- as.data.frame((as.matrix(deliver) + as.matrix(tabl) - abs(as.matrix(deliver) - as.matrix(tabl))) / 2)
  }
  
  #write this table to a file with the extension txt
  # write.table(
  #   x=tabl,
  #   file= paste0(way,file.name),
  #   col.names = TRUE,
  #   row.names = FALSE
  # )
  return(tabl)
}

Fungsi modifikasi memeriksa apakah pengiriman diberikan sebagai input is.null(deliver). Jika deliver ada, ini menghitung minimum per barang dan hari, sehingga penjualan tidak dapat melampaui pengiriman. Untuk perhitungan ini data.frame diubah menjadi matriks dan kami menggunakan minimum(x,y) = (x + y - | x - y |) / 2. Tapi hati-hati: ini berfungsi jika dan hanya jika data.frame Anda berisi angka.

Jadi untuk perhitungan penjualan Anda menggunakan pengiriman sebagai input tambahan yang defaultnya NULL:

deliver <- generate.supply(way = "", 
                           file.name= 'Shop1_in_K',
                           days=7,goods = c('Cottage cheese, pcs','Kefir, pcs', 'Sour cream, pcs'),
                           min=c(85,100,110),
                           max=c(110,120,130))# generating delivery
sales <- generate.supply(way = "", 
                         file.name= 'Shop1_out_K',
                         days=7,
                         goods = c('Cottage cheese, pcs','Kefir, pcs', 'Sour cream, pcs'),
                         min=c(85,100,110),
                         max=c(105,119,125), 
                         deliver=deliver)# generating sales
2
Martin Gal 21 Mei 2021, 11:26