使用函数 get() 以编程方式分配 quanteda docvars

问题描述

我正在开发一个例程,以在 quanteda自动定义多个语料库。我有几个控制脚本的参数,其中之一是将生成的语料库的名称。我可以使用函数 assign() 以编程方式轻松创建语料库,但我完全无法向其中添加任何 docvars

一旦我定义了语料库,我通常会在整个代码中使用函数 get() 调用它。我一直在成功地广泛使用这种方法。出于某种原因,函数 docvars() 似乎不接受使用 get() 调用的对象。

请看下面我定义语料库的简单代码,然后尝试将 docvar 与其关联。

library(quanteda)
#> Package version: 2.1.2
#> Parallel computing: 2 of 16 threads used.
#> See https://quanteda.io for tutorials and examples.
#> 
#> Attaching package: 'quanteda'
#> The following object is masked from 'package:utils':
#> 
#>     View

nameofthecorpus = "mycorpus"
mytext <- c( "This is a long speech made in 2020","This is another long speech made in 2021")
thedocvars <- c( "2020","2021" )

assign( nameofthecorpus,corpus( mytext ) )

# I can have a summary of the corpus with get()
summary( get( nameofthecorpus )  )
#> Corpus consisting of 2 documents,showing 2 documents:
#> 
#>   Text Types Tokens Sentences
#>  text1     8      8         1
#>  text2     8      8         1

# Now I wand to add some docvars automatically
# This is where I get stuck
docvars( get( nameofthecorpus ),"year" ) <- thedocvars 
#> Error in docvars(get(nameofthecorpus),"year") <- thedocvars: Could not find function "get<-"

reprex package (v1.0.0) 于 2021 年 2 月 17 日创建

原则上,我想一次将其推广到多个文档变量(例如,当它们存储在 data.frame 中时)。

有什么建议吗?

解决方法

首先,我强烈建议您使用 avoid get and assign when possible 来操作这样的变量。这是一种非常间接的方法,正如您已经看到在尝试使用这些间接值来更新值时很容易中断。当你运行类似

docvars( mycorpus,"year" ) <- thedocvars 

您正在运行一个名为 docvars<- 的特殊函数,该函数返回一个新对象,该对象将替换存储在 mycorpus 中的值。当您输入 get( nameofthecorpus ) 时,它不是一个可以替换的变量值,而是一个返回值的函数调用。所以如果你需要使用 get/assign,你必须做这样的事情

assign(nameofthecorpus,`docvars<-`(get( nameofthecorpus ),"year",thedocvars))

您是否从名称中检索值,显式调用 docvars 函数的转换版本以获取更新的对象值,然后将该值重新分配给原始变量名称。

处理 get/assign 的更好方法通常是命名列表。类似的东西

nameofthecorpus = "mycorpus"
mytext <- c( "This is a long speech made in 2020","This is another long speech made in 2021")
thedocvars <- c( "2020","2021" )

mydata <- list()
mydata[[nameofthecorpus]] <- corpus( mytext )
summary( mydata[[nameofthecorpus]]  )
docvars( mydata[[nameofthecorpus]],"year" ) <- thedocvars 

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...