通过网状在R中创建python列表

Posted

技术标签:

【中文标题】通过网状在R中创建python列表【英文标题】:Creating python list in R via reticulate 【发布时间】:2019-03-29 15:22:34 【问题描述】:

我想在 R 中通过reticulate 使用 python 分割一个波形文件,从Python, How to split a .wav file into multiple .wav files 中提取一个示例脚本

 from pydub import Audiosegment
    t1 = t1 * 1000 #Works in milliseconds
    t2 = t2 * 1000
    newAudio = AudioSegment.from_wav("oldSong.wav")
    newAudio = newAudio[t1:t2]
    newAudio.export('newSong.wav', format="wav")

我使用 R 进行了类似的操作,如下所示:

library(dplyr)
library(tidyr)
library(reticulate)
use_python('/usr/bin/python3',required = TRUE)
py_config()
pydub.py <- import('pydub')
time.start <- as.numeric(data.df.st02[loop,'time_start'])*1000
time.end <- as.numeric(data.df.st02[loop,'time_end'])*1000
new.audio <- pydub.py$AudioSegment$from_wav('142533.wav')

但返回如下错误:

> new.audio[1:2]
 Error in py_call_impl(callable, dots$args, dots$keywords) : 
  TypeError: can only concatenate list (not "int") to list 

谁能告诉我如何在R中写[t1:t2]

【问题讨论】:

“我用 R 也做了类似的事情”:请分享你使用的所有代码。 当然是@nicola 【参考方案1】:

python 子集运算符是__getitem__ 方法的包装器,: 是用于创建slice 对象的包装器。您必须导入 builtins 模块。试试这个:

require(reticulate)
use_python('/usr/bin/python3',required = TRUE)
pydub.py <- import('pydub', convert=FALSE)
pybuiltins <- import_builtins(convert=FALSE)
new.audio <- pydub.py$AudioSegment$from_wav('142533.wav')
#important: time.start and time.end must be integer
time.start <- as.integer(1*1000)
time.end <- as.integer(2*1000)
#create a slice object
sl<-pybuiltins$slice(time.start,time.end)
new.audio_split<-new.audio$`__getitem__`(sl)
new.audio_split
#<pydub.audio_segment.AudioSegment>

【讨论】:

以上是关于通过网状在R中创建python列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中创建字节列表?

在python中创建堆栈列表

如何在 Python 中创建嵌套列表

在python中创建配对元素列表

在 Python 中创建一个空列表

如何在 python 中创建列表? [复制]