RDCOMClient - установка значений вертикального диапазона

Я пытаюсь записать значения в Range по вертикали, используя RDCOMClient библиотеку. Поскольку RDCOMClient позволяет писать код, очень похожий на VBA, я искал способы сделать это в VBA, а затем перевести на R.

Базовый код R для создания Excel:

app <- COMCreate("Excel.Application")
app[['Visible']] <- TRUE

workbook <- app$WorkBooks()$Open(path)
sheet <- workbook$Worksheets(sheet_name)
sheet$Activate()

Если бы мой Range был горизонтальным, я мог бы просто написать его как:

  • VBA

    Range("A1:C1").Value = Array(1,2,3)
    
  • R

    range <- sheet$Range('A1:C1')
    range[['Value']] <- c(1,2,3)
    

Поскольку Range является вертикальным, код будет следующим:

  • VBA

    Range("A1:A3").Value = Application.Transpose(Array(1, 2, 3))
    
  • R

    range <- sheet$Range('A1:A3')
    range[['Value']] <- app$Transpose(c(1,2,3))
    

Проблема в том, что "перевод" R для вертикального регистра не работает.

Печать range[['Value']] в консоли показывает:

[[1]]
[[1]][[1]]
NULL

[[1]][[2]]
NULL

[[1]][[3]]
NULL

И app$Transpose(c(1,2,3)) показывает:

[[1]]
[[1]][[1]]
[1] 1

[[1]][[2]]
[1] 2

[[1]][[3]]
[1] 3

Почему он неправильно устанавливает значения? Как правильно это сделать?

Я также пробовал использовать матрицу:

range[['Value']] <- matrix(nrow = 3, c(1,2,3))

Но выдает ошибку:

Can't attach the RDCOMServer package needed to create a generic COM object

Я также попытался установить range[['Value']][[1]] напрямую, но безуспешно.


person Daniel    schedule 04.05.2018    source источник
comment
Не имеет значения, будет ли печать до или после результата одинакова. Я знаю, что они делают то же самое, но то, как вы пишете код, немного отличается, поэтому я сказал очень похоже. @Parfait   -  person Daniel    schedule 04.05.2018
comment
Консоль печати и Excel. Вывод на печать одинаковый до и после присвоения (без значения). Excel остается пустым без значений.   -  person Daniel    schedule 04.05.2018
comment
Вы можете запустить код, он все есть. Просто поменяйте пути.   -  person Daniel    schedule 04.05.2018
comment
Я вижу то же самое. Я обошел это чем-то вроде values <- 1:3; rng <- sheet$Range("A3:A5"); for (i in 1:rng$Cells()$Count()) { cell <- rng$Cells(i); cell[["Value"]] <- values[i] }.   -  person Jon Olav Vik    schedule 10.05.2020


Ответы (1)


Поместите вертикальный 1:7 в ячейки от B3 до B9:

r= sheet$Range("B3:B9")
r[["Value"]] <- asCOMArray(matrix(1:7, 7, 1))
person user15221546    schedule 16.02.2021